qtexted的QTextDocument无法在SetTex之后调整页面大小

2024-09-28 05:24:54 发布

您现在位置:Python中文网/ 问答频道 /正文

免责声明:我使用的是PySide2;但是,Qt(pyqt5Qtc++)中的任何答案都可以。你知道吗

我在文本编辑中设置文档大小时遇到问题。你知道吗

当我用setText(text:QString)初始化QTextEdit时,QTextEditQTextDocument的大小调整行为会改变。因此,应用setPageSize将被忽略,除非文本溢出小部件的视口。你知道吗

如果一开始我没有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


Tags: inselfiddocsednonutamet
2条回答

你的setPageSize肯定被QTextDocument()采纳了。你知道吗

为了证明这一点,我重写了resizeEvent()。 返回空的,也就是说,没有。你知道吗

您可以看到文档大小适合您的页面大小。你知道吗

您确定要更改documentsize一次,但是更改后的大小很快就会更改为原始大小。你知道吗

所以你需要注意这些变化。你知道吗

为什么会发生这种变化?

我认为这是因为执行QTextEditresizeEvent。 如果QTextEdit执行它,QAbstractTextDocumentLayout中的documentSizeChanged信号被发射。你知道吗

如果你阻止信号,当QTextEdit调整大小时,你就能得到想要的结果。对我来说,这个代码仍然有一些问题,但我想我可以回答你的问题问题。是的,文档长度超过QMainWindow。您只更改了文档大小,因此QTextEdit无法显示所有文本。也许,这可能是下一个问题。你知道吗

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

SET_TEXT_TEST = True

#In my environment PySide2 fails. So I searched the solution, I found out the codes.This codes are for my verification.
#import sys,os

# in my Environment this code is necessary
#dirname = os.path.dirname(PySide2.__file__)
#plugin_path = os.path.join(dirname, 'plugins', 'platforms')
#os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = plugin_path



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)
    def resizeEvent(self, event):
        self.document().documentLayout().blockSignals(True)
        return QTextEdit.resizeEvent(self, event)

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
    #In my environment, error happends from the second execution unless this code.
    try:
        QApplication(sys.argv)
    except Exception as e:
        print("QApplication is already exists")
    wnd = IMainWindow()
    wnd.show()
    sys.exit(QApplication.exec_())

根据@Heike的回答,解决方案非常简单,只需添加以下代码行:

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

这将产生正确的调整大小行为,并且pageSize在调整大小后保留其值。你知道吗

相关问题 更多 >

    热门问题