Python 如何重新实现QTextDocument createObject?
如何重新实现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
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