将 HTML 添加到 .setText() 会使脚本崩溃

Adding HTML to .setText() crashes the script

我有一个简单的程序,它显示 QLabels 并使用从别处检索到的数据更新它们。到目前为止,我一直在使用纯文本进行更新,但我想要 to use HTML.

特别是以下行(断章取义)更新了一个 QLabel:

self.root.calendar_today.setText(r['calendar']['today'])

有一些文字。它工作正常。

我刚刚将那行替换为

curcal = "<hr>{today}<hr>".format(
                    today=r['calendar']['today']
                )
self.root.calendar_today.setText(curcal)

现在程序崩溃了

在 stderr 上有以下内容:

QObject: Cannot create children for a parent that is in a different thread.
(Parent is QLabel(0x2f4ed98), parent's thread is QThread(0x2adc7a8), current thread is QThread(0x2f3b418)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QTextDocument(0x2fb5ea0), parent's thread is QThread(0x2f3b418), current thread is QThread(0x2adc7a8)

我不知道为什么添加一些 HTML 会触发一些关于创建线程的消息?

在使用 HTML 而不是标签中的纯文本时,有什么我应该注意的吗?

EDIT:我通过将工作线替换为 self.root.calendar_today.setText("<b>hello</b>")(仍然崩溃)

进一步简化了示例

编辑 2:根据 Martijn 的评论,我尝试用 QTextEdit 小部件替换 QLabel - 同样的问题(QObject: Cannot create children for a parent that is in a different thread. (Parent is QTextDocument(0x33c2220), parent's thread is QThread(0x2f06f00), current thread is QThread(0x33dc770))


原因

我间接找到了可能的问题所在(我开始转换代码,而ekhumoro的评论弹出)。

我使用 QThreads 时期望可以在其中设置小部件属性。事实证明 I was wrong 而我不应该这样做,而是使用信号。该代码适用于纯文本,但在 HTML 时崩溃,我猜这是多线程中的谜团之一。

我重写了我的代码以使用一些信号并且 QLabel 已正确更新,使用之前崩溃的相同代码。

我在想是否要删除这个问题,但我会把它留在这里以防有人看到同样的行为。

错误消息表明您正在以不安全的方式使用多线程。永远不要尝试从主线程外部直接更新 gui 元素。

线程间安全通信的最简单方法是使用信号。