Хотя принятый ответ работает на размер шрифта по умолчанию, он ломается при изменении размера шрифта или вертикальных полей (см. Комментарии). Класс редактирования текстовой строки ниже центрирует текст по вертикали, для всех размеров шрифтов и вертикальных полей, которые я тестировал.
Он устанавливает редактор, используя QTextDocument
, который затем присваивается экземпляру QTextEdit
. QTextDocument
s обеспечивают внутренние контейнеры для QTextEdit
и в любом случае имеют встроенные функции для обработки размеров и полей шрифтов и дают дополнительный уровень контроля над редактором.
На практике я нашел, используя QTextDocument
, позвольте мне решить проблему более интуитивно понятным способом, не имея необходимости, вы не должны вникать в ничтожную механику ширины рамок, метрик шрифтов и все такое, что мы при работе только с использованием родных методов QTextEdit
.
Заметьте, что он использует setViewportMargins()
вместо setContentMargins()
(это то, что вы можете ожидать от него), потому что последнее предназначено для установки полей для чего-то, что вставлено в макет. Следующий редактор - автономный виджет, не помещенный в какой-либо макет, поэтому setContentMargins()
ничего не сделает.
import sys
from PySide import QtGui, QtCore
class TextLineEdit(QtGui.QTextEdit):
topMarginCorrection = -4 #not sure why needed
returnPressed = QtCore.Signal()
def __init__(self, fontSize = 10, verticalMargin = 2, parent = None):
QtGui.QTextEdit.__init__(self, parent)
self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
self.setLineWrapMode(QtGui.QTextEdit.NoWrap)
self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.setFontPointSize(fontSize)
self.setViewportMargins(-verticalMargin, self.topMarginCorrection , 0, 0) #left, top, right, bottom
#Set up document with appropriate margins and font
document = QtGui.QTextDocument()
currentFont = self.currentFont()
currentFont.setPointSize(fontSize)
document.setDefaultFont(currentFont)
document.setDocumentMargin(verticalMargin)
self.setFixedHeight(document.size().height())
self.setDocument(document)
def keyPressEvent(self, event):
'''stops retun from returning newline'''
if event.key() in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return):
self.returnPressed.emit()
event.accept()
else:
QtGui.QTextEdit.keyPressEvent(self, event)
def main():
app = QtGui.QApplication(sys.argv)
myLine = TextLineEdit(fontSize = 15, verticalMargin = 8)
myLine.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
Это работает отлично и намного проще, чем метод, который я собирался попытаться использовать в качестве ключа. – neuronet
, поэтому, когда я изменяю размер шрифта, это начинает действовать очень странно (текст переключается между двумя вертикальными позициями, переключаясь назад и вперед с каждым нажатием клавиши). Когда я увеличиваю маржу достаточно, это останавливается, но маржа, необходимая для ее остановки, зависит от размера шрифта! Я сейчас работаю над этим, строя SSCCE, и опубликую здесь или отдельный вопрос, когда я выясню тайну. – neuronet
Я выразился в отдельном ответе: если вы хотите получить произвольные размеры шрифта, этот подход будет усложняться .... – neuronet