2011-11-01 30 views
1

我在PyQt4中編寫了一個跨平臺的應用程序。對於一個特定的功能,我想訪問Qt4的QTextHtmlImporter類。 PyQt4中沒有可用的直接python適配器類。該類是src/gui/text/qtextdocumentfragment_p.h文件的一部分。有沒有什麼辦法可以在Python中訪問?在PyQt4中訪問QTextHtmlImporter

我想修改QTextDocument.setHtml(),它的代碼是:

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

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

基本上設置HTML而不清除歷史記錄。我計劃通過使用派生類PyQt4的QTextDocument覆蓋setHtml函數來實現此目的。有沒有其他方法可以做到這一點?

回答

2

QTextHtmlImporter甚至不是Qt4 API的一部分,所以簡短的回答是:不,在PyQt4中沒有辦法訪問它。

您當然可以嘗試將代碼移植到PyQt4,但我猜測這將是一項不平凡的任務。

問題是:爲什麼你認爲你需要這樣做?

爲什麼不能使用QTextCursor.insertHtmlQTextDocumentFragment.fromHtml

編輯

下面是如何設置一個文本文檔HTML不清除撤消歷史上的例子:

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_()) 
+0

QTextDocument.setHtml()的工作原理是類似下面 '無效另外,QTextDocument :: setHtml(const QString&html) { Q_D(QTextDocument); setUndoRedoEnabled(false); d-> clear(); QTextHtmlImporter(this,html).import(); setUndoRedoEnabled(true); }' 我想修改它爲 'void QTextDocument :: setHtml(const QString&html) { Q_D(QTextDocument); QTextHtmlImporter(this,html).import(); }' 基本上在不清除歷史記錄的情況下設置html。我計劃通過使用PyQt4的QtextDocument的派生類來覆蓋setHtml函數。有沒有其他方法可以做到這一點? – Sharmila

+0

@Sharmila。我已經用一個如何做到這一點的基本例子更新了我的答案。 – ekhumoro

+0

不會'cursor.select(QtGui.QTextCursor.Document)'執行與2次調用'movePosition'相同的事情嗎? – alexisdm