Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何重新实现QTextDocument createObject?_Python_Pyside2_Qtextedit_Qtextdocument - Fatal编程技术网

Python 如何重新实现QTextDocument createObject?

Python 如何重新实现QTextDocument createObject?,python,pyside2,qtextedit,qtextdocument,Python,Pyside2,Qtextedit,Qtextdocument,如何重新实现QTextDocument.createObject 此方法在制作QTextFrame、QTextList、QTextTable或其他qtexobject时起作用 据我所知,我认为我的重新实施是相同的 但是内核停止了 为什么??我的代码缺少什么 from PySide2 import QtWidgets from PySide2 import QtGui from PySide2 import QtCore import PySide2 import sys import os di

如何重新实现QTextDocument.createObject

此方法在制作
QTextFrame
QTextList
QTextTable
或其他
qtexobject
时起作用

据我所知,我认为我的重新实施是相同的

但是内核停止了

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

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()

我觉得它是一个bug(我已经用PyQT5测试过了,它工作正常),这个问题是QTEXTBoTB的生命周期,因为在C++中生命周期是不确定的,因为它是指针,但它是QTrestDoC的一个孩子,所以它的生命周期是QTrestDoice的,但在python中,它似乎认为它是一个范围有限的对象(局部变量),不考虑QTextDocument对它的所有权,因为它是它的父对象。一个解决方案似乎使obj成为该类的一员:

def createObject(self,f):
self.obj=QtGui.qtexobject(self)
如果f.isListFormat():
self.obj=QtGui.QTextList(self)
elif f.isTableFormat():
self.obj=QtGui.QTextTable(self)
elif f.isFrameFormat():
self.obj=QtGui.QTextFrame(self)
返回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
class TextDocument(QtGui.QTextDocument):
def uuu init uuu(self,parent=None):
超级(文本文档,自我)。\uuuu初始化\uuuuu(父级)
self.objs=[]
def createObject(自身,f):
obj=QtGui.qtexobject(self)
如果f.isListFormat():
obj=QtGui.QTextList(self)
elif f.isTableFormat():
obj=QtGui.QTextTable(self)
elif f.isFrameFormat():
obj=QtGui.QTextFrame(self)
self.objs.append(obj)
返回obj
我更喜欢第二种解决方案,因为在第一种解决方案中,如果创建多个QTExObject,可能会产生问题,因为前一个将被删除

最后,我建议报告错误

在PySide2中,对某些对象的生命周期的处理似乎是一个持久的bug