尽管已接受的答案适用于默认字体大小,但当我更改字体大小或垂直边距时(请参见评论),它会出错。下面的文本行编辑类使文本在我测试的所有字体大小和垂直边距上垂直居中。
它使用
QTextDocument
设置编辑器,然后将其分配给
QTextEdit
实例。
QTextDocument
本来就为
QTextEdit
提供后端容器,并具有处理字体大小和边距的内置功能,并提供了对编辑器的额外控制层。
实际上,我发现使用
QTextDocument
让我以更直观的方式解决了问题,而不必深入研究框架宽度、字体度量等细节机制,这是我们仅使用本地
QTextEdit
方法时所做的。
请注意,它使用
setViewportMargins()
而不是
setContentMargins()
(您可能希望使用后者),因为后者是用于设置插入到布局中的东西的边距。以下编辑器是一个独立的小部件,没有放置在任何布局中,所以
setContentMargins()
无效。
import sys
from PySide import QtGui, QtCore
class TextLineEdit(QtGui.QTextEdit):
topMarginCorrection = -4
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)
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()