将 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 元素。
线程间安全通信的最简单方法是使用信号。
我有一个简单的程序,它显示 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 元素。
线程间安全通信的最简单方法是使用信号。