QThread 的started() 信号没有发出

Posted

技术标签:

【中文标题】QThread 的started() 信号没有发出【英文标题】:QThread's started() signal is not emitted 【发布时间】:2019-04-09 07:12:34 【问题描述】:

我发现我的应用程序的QThread.start() 不会像documentation claims 那样发出started() 信号。我已将started() 信号连接到一个插槽,但除非我明确调用started.emit(),否则它永远不会触发。


我已将代码缩减为问题的可运行演示。可以看到,signal其实是连接到slot的,线程其实是start()启动的,所以这两个都不是问题。

started() 从不发出,这有什么问题?

#!/usr/bin/env python3

import PySide2.QtCore
import PySide2.QtWidgets


@PySide2.QtCore.Slot()
def test_receiver():
    print('thread.started() signal received.')


if __name__ == '__main__':
    app = PySide2.QtWidgets.QApplication()
    app.processEvents()

    thread = PySide2.QtCore.QThread()
    thread.started.connect(test_receiver)

    thread.start()

    # The connection between signal and slot isn't the problem because
    # the signal has actually connected, as evidenced if you uncomment the following line:
    # 
    # thread.started.emit()
    # 
    # So why is thread.started() never emitted after thread.start()?


    while thread.isRunning():
        print('Thread is running...')
        PySide2.QtCore.QThread.sleep(1)

    print('Everything quit.')

【问题讨论】:

@thuga 哦,天哪,这太明显了。我想我今天没有想。如果您将其作为答案,我会将其标记为已接受。 【参考方案1】:

您的while 循环阻塞了事件循环。 started 信号是从另一个线程发出的。在这种情况下,将使用排队连接,这意味着主线程需要检查事件队列以处理插槽调用,但您的 while 循环阻塞了它。

【讨论】:

以上是关于QThread 的started() 信号没有发出的主要内容,如果未能解决你的问题,请参考以下文章

如何向 Qt 中 QThread 类的特定对象发出信号?

Qthread在Golang中只发出一个信号

Python QT发出信号没有调用回调函数

QTcpSocket Disconnected() 未发出信号

QThread如何从其自己的线程发送一个带有枚举作为QML消耗参数的信号?

QThread 没有启动