如何重新实现QTextDocument createObject?

问题描述 投票:1回答:1

如何重新实现QTextDocument.createObject

此方法在制作QTextFrameQTextListQTextTable或其他QTextObject中起作用。

根据woboq,我认为我的重新实现是相同的。

但是内核停止了。

为什么?我的代码缺少什么?

from PySide2 import QtWidgets
from PySide2 import QtGui
from PySide2 import QtCore
import PySide2
import sys
import os
dirname = os.path.dirname(PySide2.__file__)
plugin_path = os.path.join(dirname, 'plugins', 'platforms')
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = plugin_path
class TextEdit(QtWidgets.QTextEdit):
    def __init__(self, parent=None):
        super(TextEdit, self).__init__(parent=None)
        document = TextDocument(self)
        self.setDocument(document)            
class TextDocument(QtGui.QTextDocument):
    def __init__(self, parent=None):
        super(TextDocument, self).__init__(parent=None)      
        self.setParent(parent)    
    def createObject(self, f):
        obj = QtGui.QTextObject(self)
        if f.isListFormat():
            obj = QtGui.QTextList(self)
        elif f.isTableFormat():
            obj = QtGui.QTextTable(self)
        elif f.isFrameFormat():            
            obj = QtGui.QTextFrame(self)                
        return obj       
def main():
    if QtWidgets.QApplication.instance() is not None:
        app = QtWidgets.QApplication.instance()
    else:
        app = QtWidgets.QApplication([])
    mainwindow = TextEdit()
    mainwindow.show()
    sys.exit(QtWidgets.QApplication.exec_())
if __name__ == "__main__":
    main()
python pyside2 qtextedit qtextdocument
1个回答
2
投票

在我看来,这是一个错误(我已经用PyQt5测试了它并且可以正常工作),问题是QTextObject的生命周期,因为在C ++中,生命周期是不确定的,因为它是一个指针,但是QTextDocument的子级,因此它的生命周期是QTextDocument的生命周期,但是在python中,它似乎将其视为有限范围的对象(局部变量),因为它是其父级,因此不尊重QTextDocument对此的所有权。解决方法似乎是使obj成为该类的成员:

def createObject(self, f):
    self.obj = QtGui.QTextObject(self)
    if f.isListFormat():
        self.obj = QtGui.QTextList(self)
    elif f.isTableFormat():
        self.obj = QtGui.QTextTable(self)
    elif f.isFrameFormat():
        self.obj = QtGui.QTextFrame(self)
    return self.obj

或使用作为类成员的容器。

class TextDocument(QtGui.QTextDocument):
    def __init__(self, parent=None):
        super(TextDocument, self).__init__(parent)
        self.objs = []

    def createObject(self, f):
        obj = QtGui.QTextObject(self)
        if f.isListFormat():
            obj = QtGui.QTextList(self)
        elif f.isTableFormat():
            obj = QtGui.QTextTable(self)
        elif f.isFrameFormat():
            obj = QtGui.QTextFrame(self)
        self.objs.append(obj)
        return obj

我更喜欢第二种解决方法,因为在第一种解决方法中,如果创建多个QTextObject可能会产生问题,因为前一个将被删除。

最后我建议报告该错误。

处理某些对象的生命周期似乎是PySide2中的永久性错误。

© www.soinside.com 2019 - 2024. All rights reserved.