gpt4 book ai didi

python - QTextEdit 的 QTextDocument 在 SetText 后无法调整页面大小

转载 作者:行者123 更新时间:2023-12-01 07:54:18 28 4
gpt4 key购买 nike

免责声明:我正在使用 PySide2 ;然而,Qt 中的任何答案( pyqt5Qt c++)都可以。

我在文本编辑中设置文档大小时遇到​​问题。

当我初始化QTextEdit时与 setText(text:QString)QTextEdit 的大小调整行为的QTextDocument变化。因此申请setPageSize被忽略,除非文本在小部件的视口(viewport)上溢出。

如果我不这样做setText最初,无论我是否调整窗口大小,都会正确考虑文档大小。

下面是我所经历的奇怪行为的一个最小示例。如果您运行代码,然后尝试调整窗口大小,您将看到当文本超出小部件时会考虑 pageSize;但是,如果不是,则 QTextEdit的 pageSize 将与其宽度匹配,其高度为 -1。

如果您关闭SET_TEXT_TEST那么从一开始就没有问题。如果有任何解释或解决方法,我很乐意听到。

import PySide2
from PySide2.QtGui import *
from PySide2.QtWidgets import *
from PySide2.QtCore import *
from PySide2.QtPrintSupport import *

SET_TEXT_TEST = True


class IPageEdit(QTextEdit):
def __init__(self, parent=None):
super().__init__(parent)
# these lines don't seem to do anything
doc = self.document()
pageSize = QPageSize(QPageSize.A6).size(QPageSize.Point)
doc.setPageSize(QPageSize(QPageSize.A6).size(QPageSize.Point))

def paintEvent(self, event):
doc = self.document()
pageSize = QPageSize(QPageSize.A6).size(QPageSize.Point)
doc.setPageSize(QPageSize(QPageSize.A6).size(QPageSize.Point))

print('({},{}) ({},{})'.format(
pageSize.width(),
pageSize.height(),
doc.pageSize().width(),
doc.pageSize().height()))

painter = QPainter(self.viewport())
doc.drawContents(painter)


class IMainWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.resize(1000, 500)
self.setContentsMargins(20, 20, 20, 20)

pageEdit = IPageEdit(self)
if SET_TEXT_TEST:
pageEdit.setText('''\
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Velit aliquet sagittis id consectetur purus ut faucibus pulvinar elementum. Metus vulputate eu scelerisque felis imperdiet proin fermentum leo vel. Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Enim neque volutpat ac tincidunt vitae semper. Leo duis ut diam quam nulla porttitor massa id neque. Cras pulvinar mattis nunc sed blandit libero volutpat. Eleifend quam adipiscing vitae proin sagittis. Nulla facilisi cras fermentum odio eu feugiat pretium nibh. Tellus molestie nunc non blandit massa enim nec dui nunc. Eget nullam non nisi est sit amet. Sed odio morbi quis commodo odio aenean sed. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Adipiscing diam donec adipiscing tristique risus nec. Sit amet consectetur adipiscing elit ut aliquam purus sit. Sed sed risus pretium quam. Elit pellentesque habitant morbi tristique senectus. Turpis egestas sed tempus urna.

Nunc aliquet bibendum enim facilisis gravida neque. Condimentum id venenatis a condimentum vitae sapien pellentesque habitant. Purus sit amet volutpat consequat mauris. Mauris in aliquam sem fringilla ut morbi tincidunt augue interdum. Ultrices mi tempus imperdiet nulla malesuada pellentesque elit. Dolor purus non enim praesent elementum facilisis leo vel. Donec adipiscing tristique risus nec. Non consectetur a erat nam. Fusce id velit ut tortor pretium. Sit amet nulla facilisi morbi tempus iaculis urna. Vel facilisis volutpat est velit egestas. Ac orci phasellus egestas tellus rutrum tellus pellentesque.

Turpis tincidunt id aliquet risus feugiat in ante metus. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Amet luctus venenatis lectus magna fringilla urna. Morbi blandit cursus risus at ultrices mi tempus imperdiet. Sit amet porttitor eget dolor. Nec ultrices dui sapien eget mi. Turpis massa tincidunt dui ut ornare lectus sit. Ac odio tempor orci dapibus. Et netus et malesuada fames ac turpis egestas integer. Morbi quis commodo odio aenean. Vulputate sapien nec sagittis aliquam malesuada. Lobortis mattis aliquam faucibus purus in. Sem fringilla ut morbi tincidunt. Volutpat commodo sed egestas egestas fringilla phasellus faucibus.

Tempor orci dapibus ultrices in iaculis nunc sed augue. Etiam sit amet nisl purus in mollis nunc sed. Nulla porttitor massa id neque aliquam vestibulum morbi. Nibh tortor id aliquet lectus proin. Venenatis urna cursus eget nunc scelerisque viverra mauris in. Volutpat odio facilisis mauris sit. Magna eget est lorem ipsum dolor sit amet consectetur. Lacinia quis vel eros donec ac odio tempor. Justo donec enim diam vulputate. Fringilla urna porttitor rhoncus dolor purus. In dictum non consectetur a erat nam at. Egestas erat imperdiet sed euismod nisi porta lorem. Scelerisque fermentum dui faucibus in ornare quam viverra orci. Lectus proin nibh nisl condimentum id venenatis a. Faucibus pulvinar elementum integer enim neque volutpat ac tincidunt. Habitasse platea dictumst quisque sagittis purus sit amet volutpat consequat. Enim sed faucibus turpis in.

Eu lobortis elementum nibh tellus molestie nunc non blandit. Dui id ornare arcu odio. Sit amet nisl purus in mollis nunc sed id semper. Senectus et netus et malesuada fames. Porttitor rhoncus dolor purus non enim praesent elementum. Amet est placerat in egestas erat imperdiet sed euismod. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Tellus molestie nunc non blandit massa enim nec. Pellentesque eu tincidunt tortor aliquam nulla. Ut consequat semper viverra nam libero.
''')
self.setCentralWidget(pageEdit)


if __name__ == '__main__':
import sys

app = QApplication(sys.argv)
wnd = IMainWindow()
wnd.show()
sys.exit(app.exec_())

为了演示这里有一些图像:

页面大小宽度约为 1000 Wide Window

页面大小宽度为623.0 Window A No Wrap

页面大小宽度为622.0 Window A Wrapped

最佳答案

根据@Heike的回复,解决方案就像添加这行代码一样简单:

class IPageEdit(QTextEdit):
def __init__(self, parent=None):
super().__init__(parent)
self.setLineWrapMode(QTextEdit.FixedPixelWidth)
...

这会产生正确的调整大小行为,并且 pageSize 在调整大小后保留其值。

关于python - QTextEdit 的 QTextDocument 在 SetText 后无法调整页面大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56050260/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com