完成后将QRunnable连接到功能/方法 [英] Connect QRunnable to a function/method when finished

查看:133
本文介绍了完成后将QRunnable连接到功能/方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

QThread具有结束信号,当线程结束(连接到方法/函数)时,我可以执行某些操作,但是我也想使用QRunnable来执行此操作.完成后,是否可以将QRunnable线程连接到方法/函数?

QThread has a finished signal, and I am able to do something when thread is finished (connect to a method/function), however I would like to do this with QRunnable as well. Is there a way to connect the QRunnable thread to a method/function when it is done?

QThread:

class HelloWorldTask(QThread):
    def __init__(self):
        QThread.__init__(self)
    def run(self):
        import time
        time.sleep(3)
        print ("Running thread \n")
        time.sleep(3)

hello.finished.connect(check)

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

输出:

运行线程

完成

QRunnable:

QRunnable:

instance = QThreadPool.globalInstance()


class HelloWorldTask(QRunnable):
    def __init__(self):
        super().__init__(self)
    def run(self):
        import time
        time.sleep(3)
        print ("Running thread \n")
        time.sleep(3)

hello = HelloWorldTask()
#hello.finished.connect(check) <-- how to connect to a method/function when finished.
instance.start(hello)
print(instance.waitForDone())

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

所需的输出:

运行线程

线程完成

推荐答案

QRunnable没有完成信号,因为它不是QObject,因此可能的解决方案是创建另一个继承自QObject的类,以便它发出信号. :

QRunnable does not have a finished signal since it is not a QObject, so a possible solution is to create another class that inherits from QObject so that it emits the signal:

from PyQt5 import QtCore


class Signals(QtCore.QObject):
    finished = QtCore.pyqtSignal()


class HelloWorldTask(QtCore.QRunnable):
    def __init__(self):
        super().__init__()
        self.signal = Signals()

    def run(self):
        import time

        time.sleep(3)
        print("Running thread \n")
        time.sleep(3)
        self.signal.finished.emit()


def check():
    print("Thread Done")
    QtCore.QCoreApplication.quit()


if __name__ == "__main__":
    import sys

    app = QtCore.QCoreApplication(sys.argv)
    hello = HelloWorldTask()
    hello.signal.finished.connect(check)
    QtCore.QThreadPool.globalInstance().start(hello)
    sys.exit(app.exec_())

这篇关于完成后将QRunnable连接到功能/方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆