Как переопределить QTextDocument createObject? - PullRequest
1 голос
/ 23 января 2020

Как переопределить QTextDocument.createObject?

этот метод играет роль в создании QTextFrame, QTextList, QTextTable или других 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()

1 Ответ

2 голосов
/ 23 января 2020

Мне кажется, что это ошибка (я тестировал ее с 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)
        <b>self.objs = []</b>

    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)
        <b>self.objs.append(obj)</b>
        return obj

Я предпочитаю второй обходной путь, так как в В первом случае вы можете создать проблемы, если создадите несколько объектов QTextObject, поскольку предыдущий будет удален.

Наконец, я рекомендую сообщить об ошибке.

Обработка жизни цикл некоторых объектов кажется постоянной ошибкой в ​​PySide2.

...