是否允许使用辅助线程来执行QTextBrowser.insertHtml()?

min*_*ion 3 qt qt4 pyqt qt5

我产生一个辅助线程来执行一些单调乏味的工作,目标传递QTextBrowser给它,并希望它由可输出运行时消息insertHtml()QTextBrowser.有时它可以工作,但最终会崩溃应用程序.

最初,我使用print(),并将stdout和sderr重定向到QTextBrowser.它运作良好.因为我需要富文本功能所以我放弃了这种方法.

这里这里或这里,我注意到它可能不合法.

在GUI应用程序中,主线程也称为GUI线程,因为它是唯一允许执行GUI相关操作的线程.

如上所述,每个程序在启动时都有一个线程.该线程称为"主线程"(在Qt应用程序中也称为"GUI线程").Qt GUI必须在此线程中运行.所有小部件和几个相关的类(例如QPixmap)在辅助线程中不起作用

我不确定.我需要有人来证实这一点.并且可以建议实施它的常规方法.

thu*_*uga 6

通常,GUI类(小部件+其他一些)只应在主线程中使用,如您在问题中引用的文档中所述.所以是的,不要QTextBrowser在新线程中搞乱.

文档还指出:如果Qt类打算被多个线程使用,则它们仅被记录为线程安全的.如果函数未标记为线程安全或可重入,则不应在不同的线程中使用它.如果某个类未标记为线程安全或可重入,则不应从不同的线程访问该类的特定实例.

但你应该注意到这insertHtml是一个插槽.因此,您可以轻松地将信号连接到您在不同线程中发出的信号(只是不要明确地将其直接连接).