QTextEdit.insertHtml()非常缓慢

3

我已经放弃尝试使其更快了。

我的最大问题是,在插入HTML时,应用程序变得非常缓慢。

我有一个进度条,我正在调用:

QCoreApplication.processEvents()

(顺便说一下,我正在使用pyqt)

我能把insertHtml()放到另一个线程中吗,这样我就不会有无响应的界面了吗? 我该如何做呢?我已经研究了QThread和QThreadPool,但我不太确定从哪里开始。


2
我告诉你一个秘密。QPlainTextEdit::setText() 也非常慢。 - Haiyuan Li
QPlainTextEdit没有setText()函数。也许你想用的是QTextEdit::setText()?那个函数应该被避免,因为每次调用它都会尝试通过检查文本中的字符来确定要插入的文本是HTML还是纯文本。相反,使用setHtml()或setPlainText()。除非你使用复杂的HTML,否则可以看一下支持基本HTML并且比QTextEdit快得多的QPlainText。 - Daniel Hedberg
2个回答

7

我也遇到过这个问题,下面是我采取的一些方法来加快速度:

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

这将消除不必要的开销。

此外,在插入大量文本时,最好关闭屏幕更新:

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

我在Qt文档中某个地方看到过这个建议,但现在找不到了。

[编辑] 我偶然找到了文档中的位置(刚好赶上它们被QT5更新,嘿嘿http://qt-project.org/doc/qt-4.8/qwidget.html#updatesEnabled-prop


3
在GUI应用程序中,主线程也称为GUI线程,因为它是唯一允许执行与GUI相关的操作的线程。--来自Qt文档 所以,不行。很遗憾,您无法在线程中执行该操作。 编辑:技术上是可能的。我刚刚写了一个简短的代码片段来实现,但是以那种方式使用Qt GUI对象是非常不安全的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接