You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为QRunnable绑定结束回调?实现类似QThread的finished信号功能

在QRunnable中实现线程结束的回调/信号机制

QRunnable本身并没有继承QObject,所以它不像QThread那样自带finished信号。不过我们有两种常用的方法来实现线程结束时触发回调的需求,下面分别介绍:

方法一:让QRunnable继承QObject,添加自定义finished信号

这种方法最贴近QThread的使用习惯,利用Qt的信号槽机制来触发回调。我们只需要让自定义的任务类同时继承QObject和QRunnable,然后定义自己的finished信号,在run方法执行完毕时发射这个信号即可。

完整代码示例:

from PyQt5.QtCore import QObject, QRunnable, QThreadPool, pyqtSignal
import time

def check():
    print('Thread Done')

class HelloWorldTask(QObject, QRunnable):
    # 定义自定义的finished信号
    finished = pyqtSignal()

    def __init__(self):
        QObject.__init__(self)
        QRunnable.__init__(self)

    def run(self):
        time.sleep(3)
        print("Running thread \n")
        time.sleep(3)
        # 线程任务完成后发射信号
        self.finished.emit()

if __name__ == "__main__":
    instance = QThreadPool.globalInstance()
    hello = HelloWorldTask()
    # 连接信号到回调函数
    hello.finished.connect(check)
    instance.start(hello)
    # 等待所有任务完成(可选,根据你的需求决定是否需要)
    instance.waitForDone()

运行这段代码后,你会得到期望的输出:

Running thread 

Thread Done

方法二:直接传入回调函数(无需信号槽)

如果你的场景不需要和Qt的其他信号槽系统交互,这种方法更轻量。我们可以在初始化QRunnable的时候传入一个回调函数,然后在run方法的最后直接调用这个函数。

代码示例:

from PyQt5.QtCore import QRunnable, QThreadPool
import time

def check():
    print('Thread Done')

class HelloWorldTask(QRunnable):
    def __init__(self, callback=None):
        super().__init__()
        self.callback = callback

    def run(self):
        time.sleep(3)
        print("Running thread \n")
        time.sleep(3)
        # 如果有回调函数,就执行它
        if self.callback is not None:
            self.callback()

if __name__ == "__main__":
    instance = QThreadPool.globalInstance()
    # 初始化任务时传入回调函数
    hello = HelloWorldTask(callback=check)
    instance.start(hello)
    instance.waitForDone()

这个方案的输出和第一种完全一致,而且不需要继承QObject,代码更简洁。

两种方法的选择建议

  • 如果你需要和Qt的其他组件(比如UI控件)交互,优先选择方法一,因为信号槽机制是Qt的标准做法,能保证线程安全(比如更新UI时需要在主线程执行,信号槽会自动处理线程切换)。
  • 如果只是简单的后台任务完成后执行一段逻辑,方法二更轻便,不需要引入QObject的额外开销。

内容的提问来源于stack exchange,提问作者Drees

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:57:42