1

我正在尝试创建一个富文本编辑器,其布局类似于 Microsoft Word 的“页面视图”或“打印布局”。我想让 QTextEdit 在主窗口中水平居中,滚动条与主窗口的最右边缘对齐。

我找不到独立于 QTextEdit 本身移动 QTextEdit 的默认滚动条的方法。相反,我尝试创建一个单独的滚动条,并使用此处找到的解决方案使 QTextEdit 垂直增长:A QWidget like QTextEdit that wraps its height automatically to its contents?

这是我的尝试:

import sys
from PySide import QtGui, QtCore

class MainWindow(QtGui.QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()
        self.initUI()

    def initUI(self):
        cw = CentralWidget()
        self.setCentralWidget(cw)

        self.setGeometry(200, 200, 1000, 600)

        self.show()

    def resizeEvent(self, event):
        self.centralWidget().setFixedHeight(event.size().height())

class CentralWidget(QtGui.QWidget):

    def __init__(self):
        super(CentralWidget, self).__init__()
        self.initUI()

    def initUI(self):

        text = MainTextEdit()
        text.setMinimumWidth(850)
        text.setStyleSheet('border: 0;')

        pageWidget = QtGui.QWidget()

        scroll = QtGui.QScrollArea()
        scroll.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
        scroll.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        scroll.setMaximumWidth(18)
        # If you change setWidgetResizeable to False,
        # the textedit will center, but scrolling will not work.
        scroll.setWidgetResizable(True)
        scroll.setWidget(pageWidget)

        hbox = QtGui.QHBoxLayout()
        hbox.setContentsMargins(0,0,0,0)
        hbox.addStretch(0.5)
        hbox.addWidget(text)
        hbox.addStretch(0.5)
        pageWidget.setLayout(hbox)

        hbox2 = QtGui.QHBoxLayout()
        hbox2.setContentsMargins(0,0,0,0)
        hbox2.addWidget(pageWidget)
        hbox2.addWidget(scroll)
        self.setLayout(hbox2)

class MainTextEdit(QtGui.QTextEdit):

    def __init__(self, *args, **kwargs):
        super(MainTextEdit, self).__init__(*args, **kwargs)  

        self.document().contentsChanged.connect(self.sizeChange)

        self.setFontPointSize(80)

        self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)

    def sizeChange(self):
        docHeight = self.document().size().height()
        self.setMinimumHeight(docHeight)

def main():

    app = QtGui.QApplication(sys.argv)
    mw = MainWindow()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

这至少有两个问题:

问题 #1

照原样,上面的代码不会在主窗口中水平居中 QTextEdit,但最右边的滚动条确实有效。如果更改scroll.setWidgetResizable(True)scroll.setWidgetResizable(False)第 41 行,QTextEdit 将水平居中,但滚动条不起作用。似乎您可以获得一个或另一个功能,但不能同时获得两者。

问题 #2

为了防止 MainWindow 在 QTextEdit 增长时自动扩展,每当调整 MainWindow 的大小时,MainWindow 都会为 CentralWidget 分配一个固定的高度(参见上面代码的第 19 行)。在用户尝试垂直缩小主窗口之前,这很有效。窗口可以通过单击并拖动底部边框进行垂直扩展,但不能垂直缩小。

结论

也许这是错误的方法。有什么建议么?

4

1 回答 1

0

通过继承自setViewportMargins的设置对称边距。QTextEditQAbstractScrollArea

例子:

from PySide import QtGui, QtCore

app = QtGui.QApplication([])
window = QtGui.QWidget()
layout = QtGui.QVBoxLayout(window)
edit = QtGui.QTextEdit('jfdh afdhgfkjg fdnvfh vklkfjvkflj lddkl ljklfjkl jvkldjfkvljfgvjldf ll dl dljvklj ljljlbl  llkb jbgl')
edit.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
edit.setViewportMargins(30, 0, 30, 30)
layout.addWidget(edit)
window.show()
app.exec_()

给出:

未附加垂直滚动条。

于 2014-09-16T15:15:17.060 回答