QTextEdit.insertHtml() is very slow

2019-02-19 17:31发布

I've given up on actually trying to make it go faster.

My biggest problem is that when I'm inserting the html, the application slows down to a crawl. I have a progressbar, and I'm calling

QCoreApplication.processEvents()

(I'm using pyqt, by the way)

Can I put insertHtml() into a different thread, so I don't have an unresponsive interface? How would I go about that? I've looked into QThread and QThreadPool, and I'm not quite sure where to begin.

标签: qt qt4 pyqt
2条回答
Rolldiameter
2楼-- · 2019-02-19 17:51

I had this problem as well, here are a few things I did to make it faster:

TxtBrows->setAcceptRichText(false);
TxtBrows->setContextMenuPolicy(Qt::NoContextMenu);
TxtBrows->setOpenLinks(false);
TxtBrows->setReadOnly(true);
TxtBrows->setUndoRedoEnabled(false);

This should get rid of unneeded overhead.

Also when inserting large amounts of text its good to turn off screen updates:

setUpdatesEnabled(false);
    TxtBrows->append(SomeBigHTMLString);
setUpdatesEnabled(true);

This was recommended somewhere in the Qt documentation but I can't find the spot just now.

[Edit] I stumbled across the spot in the Docs (just in time for them to be outdated by QT5 grinn) http://qt-project.org/doc/qt-4.8/qwidget.html#updatesEnabled-prop

查看更多
啃猪蹄的小仙女
3楼-- · 2019-02-19 18:18

In GUI applications, the main thread is also called the GUI thread because it's the only thread that is allowed to perform GUI-related operations. -- from the Qt Docs

So, no. Unfortunately you cannot perform that operation in a thread.

Edit: Technically, it is possible. I just wrote a short snippet that did so, however using Qt GUI objects in that way is highly unsafe.

查看更多
登录 后发表回答