如何在 QTextEdit 实例中垂直居中单行 (PySide/PyQt)?
How to vertically center a single-line in a QTextEdit instance (PySide/PyQt)?
我有一个继承自 QTextEdit
的行编辑器,我用它来编辑显示富文本的视图项。 QTextEdit.setAlignment
的第二个参数是“QtAligntment”,the docs 说:
Valid alignments are Qt.AlignLeft, Qt.AlignRight, Qt.AlignJustify and
Qt.AlignCenter (which centers horizontally).
也就是说,本机不支持垂直对齐。 QTextEdit
?
中是否有间接的方式让文本垂直居中?
相关link
Center the Text of QTextEdit horizontally and vertically :不幸的是,接受的答案使用 QLineEdit
这对我不起作用。
线索?
在下文中,我找到了有关如何在 C++/Qt 中执行此操作的线索。我几乎可以理解它,但不完全是,因为它适用于 c++:
http://www.qtcentre.org/threads/26003-Vertical-centering-of-a-QTextEdit
我会自己破解几天并尝试自己回答,但现在想 post 以防有人已经破解或在 different/better 方式。
对于垂直居中的单行编辑,您只需计算出正确的固定高度即可。
使用,可以这样实现:
class RichTextLineEdit(QtGui.QTextEdit):
def __init__(self, parent=None):
...
margin = 1
self.document().setDocumentMargin(margin)
fontMetrics = QtGui.QFontMetrics(self.font())
height = fontMetrics.height() + (margin + self.frameWidth()) * 2
self.setFixedHeight(height)
(注意:重新实现的 sizeHint
和 minimumSizeHint
方法在原始示例中可能是多余的)。
虽然接受的答案适用于默认字体大小,但当我更改字体大小或垂直边距时它会中断(请参阅评论)。对于我测试过的所有字体大小和垂直边距,下面的文本行编辑 class 将文本垂直居中。
它使用 QTextDocument
设置编辑器,然后分配给 QTextEdit
实例。 QTextDocument
s 为 QTextEdit
s 提供了 back-end 容器,并具有 built-in 处理字体大小和边距的功能,并为编辑器提供了额外的控制层。
在实践中,我发现使用 QTextDocument
让我以更直观的方式解决问题,而无需深入研究框架宽度、字体规格的 nitty-gritty 机制,以及我们在仅使用本机 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()
我有一个继承自 QTextEdit
的行编辑器,我用它来编辑显示富文本的视图项。 QTextEdit.setAlignment
的第二个参数是“QtAligntment”,the docs 说:
Valid alignments are Qt.AlignLeft, Qt.AlignRight, Qt.AlignJustify and Qt.AlignCenter (which centers horizontally).
也就是说,本机不支持垂直对齐。 QTextEdit
?
相关link
Center the Text of QTextEdit horizontally and vertically :不幸的是,接受的答案使用 QLineEdit
这对我不起作用。
线索?
在下文中,我找到了有关如何在 C++/Qt 中执行此操作的线索。我几乎可以理解它,但不完全是,因为它适用于 c++:
http://www.qtcentre.org/threads/26003-Vertical-centering-of-a-QTextEdit
我会自己破解几天并尝试自己回答,但现在想 post 以防有人已经破解或在 different/better 方式。
对于垂直居中的单行编辑,您只需计算出正确的固定高度即可。
使用
class RichTextLineEdit(QtGui.QTextEdit):
def __init__(self, parent=None):
...
margin = 1
self.document().setDocumentMargin(margin)
fontMetrics = QtGui.QFontMetrics(self.font())
height = fontMetrics.height() + (margin + self.frameWidth()) * 2
self.setFixedHeight(height)
(注意:重新实现的 sizeHint
和 minimumSizeHint
方法在原始示例中可能是多余的)。
虽然接受的答案适用于默认字体大小,但当我更改字体大小或垂直边距时它会中断(请参阅评论)。对于我测试过的所有字体大小和垂直边距,下面的文本行编辑 class 将文本垂直居中。
它使用 QTextDocument
设置编辑器,然后分配给 QTextEdit
实例。 QTextDocument
s 为 QTextEdit
s 提供了 back-end 容器,并具有 built-in 处理字体大小和边距的功能,并为编辑器提供了额外的控制层。
在实践中,我发现使用 QTextDocument
让我以更直观的方式解决问题,而无需深入研究框架宽度、字体规格的 nitty-gritty 机制,以及我们在仅使用本机 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()