如何在QTextEdit实例(PySide / PyQt)中垂直居中单行?

时间:2015-10-05 04:38:54

标签: qt pyqt pyside

我有一个继承自QTextEdit的行编辑器,我用它来编辑显示富文本的视图项。 QTextEdit.setAlignment的第二个参数是`QtAligntment'和the docs说:

  

有效对齐是Qt.AlignLeft,Qt.AlignRight,Qt.AlignJustify和   Qt.AlignCenter(水平居中)。

也就是说,垂直对齐没有原生支持。在QTextEdit中是否有间接的方式将文本垂直居中?

相关链接

Center the Text of QTextEdit horizontally and vertically:不幸的是,接受的答案使用的QLineEdit对我来说不起作用。

一个线索?

在下面我发现了一个关于如何在C ++ / Qt中完成它的线索。我几乎能够遵循它,但不完全,因为它适用于c ++:

http://www.qtcentre.org/threads/26003-Vertical-centering-of-a-QTextEdit

我会自己破解它几天并尝试自己回答,但是现在想发布这个以防有人已经破解它或以不同/更好的方式完成它。

2 个答案:

答案 0 :(得分:2)

对于垂直居中的单行编辑,您只需要计算正确的固定高度。

使用example delegate from your previous question,可以这样实现:

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)

(注意:重新实现的sizeHintminimumSizeHint方法在原始示例中可能是多余的。)

答案 1 :(得分:1)

虽然接受的答案适用于默认字体大小,但在我更改字体大小或垂直边距时会中断(请参阅注释)。对于我测试的所有字体大小和垂直边距,下面的文本行编辑类将文本垂直居中。

它使用QTextDocument设置编辑器,然后将其分配给QTextEdit实例。 QTextDocument无论如何都为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()