Accessing QTextHtmlImporter in PyQt4

2019-08-02 09:25发布

I'm writing a cross platform app in PyQt4. For a particular feature, I would like to access the QTextHtmlImporter class of Qt4. There is no direct python adapter class available in PyQt4. The class is part of the src/gui/text/qtextdocumentfragment_p.h file. Is there any way I can access that in Python?

I would like to modify QTextDocument.setHtml(), which code is:

void QTextDocument::setHtml(const QString &html) { 
    Q_D(QTextDocument); setUndoRedoEnabled(false); 
    d->clear(); 
    QTextHtmlImporter(this, html).import(); 
    setUndoRedoEnabled(true); 
} 

to

void QTextDocument::setHtml(const QString &html) { 
    Q_D(QTextDocument); 
    QTextHtmlImporter(this, html).import(); 
} 

Basically setting the HTML without clearing the history. I planned to do this by using a derived class of PyQt4's QTextDocument overriding the setHtml function. Is there any other way to do this?

1条回答
我欲成王,谁敢阻挡
2楼-- · 2019-08-02 10:16

QTextHtmlImporter isn't even part of the Qt4 API, so the short answer is: no, there's no way to access it in PyQt4.

You could, of course, attempt to port the code to PyQt4, but I'm guessing that would be a non-trivial task.

The question is: why do you think you need to do this?

Why can't you use QTextCursor.insertHtml or QTextDocumentFragment.fromHtml?

EDIT

Here's an example of how to set the html in a text document without clearing the undo history:

from PyQt4 import QtGui, QtCore

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        layout = QtGui.QVBoxLayout(self)
        self.edit = QtGui.QTextEdit(self)
        self.undo = QtGui.QPushButton('Undo')
        self.redo = QtGui.QPushButton('Redo')
        self.insert = QtGui.QPushButton('Set Html')
        layout.addWidget(self.edit)
        layout.addWidget(self.undo)
        layout.addWidget(self.redo)
        layout.addWidget(self.insert)
        self.undo.clicked.connect(self.edit.undo)
        self.redo.clicked.connect(self.edit.redo)
        self.insert.clicked.connect(self.handleInsert)
        self.edit.append('One')
        self.edit.append('Two')
        self.edit.append('Three')

    def handleInsert(self):
        cursor = QtGui.QTextCursor(self.edit.document())
        cursor.select(QtGui.QTextCursor.Document)
        cursor.insertHtml("""<p>Some <b>HTML</b> text</p>""")

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    win = Window()
    win.show()
    sys.exit(app.exec_())
查看更多
登录 后发表回答