我正在尝试创建一个富文本编辑器,其布局类似于 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 行)。在用户尝试垂直缩小主窗口之前,这很有效。窗口可以通过单击并拖动底部边框进行垂直扩展,但不能垂直缩小。
结论
也许这是错误的方法。有什么建议么?