3

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.

Dane Larsen
  • 1,534
  • 2
  • 18
  • 27
  • 2
    I tell you a secret. QPlainTextEdit::setText() is aslo very slow. – Haiyuan Li Jun 15 '12 at 02:45
  • QPlainTextEdit doesn't have a setText() function. Perhaps you mean QTextEdit::setText()? That function should be avoided as on each invokation it tries to determine whether the text to be inserted is HTML or plain text by investigating the characters in the text. Instead use setHtml() or setPlainText(). Unless you use complex HTML have a look at QPlainText which supports basic HTML and is a lot faster than QTextEdit. – Daniel Hedberg Nov 04 '15 at 19:26

2 Answers2

7

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

odinthenerd
  • 5,422
  • 1
  • 32
  • 61
3

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.

Casey
  • 6,166
  • 3
  • 35
  • 42