PyQt5 - 如何从工作线程发出信号以通过 GUI 线程调用事件

Posted

技术标签:

【中文标题】PyQt5 - 如何从工作线程发出信号以通过 GUI 线程调用事件【英文标题】:PyQt5 - How to emit signal from worker tread to call event by GUI thread 【发布时间】:2016-12-16 12:44:13 【问题描述】:

正如我在标题中提到的。我该怎么做?

class Main(QWidget):

        def __init__(self):

                super().__init__()

        def StartButtonEvent(self):

                self.test = ExecuteThread()
                self.test.start()

        def MyEvent(self):

                #MainThreadGUI

class ExecuteThread(QThread):

        def run(self):

                # A lot of work

                # Signal to main thread about finishing of job = mainthread will perform MyEvent

我在这里找到了一些教程pyqt4 emiting signals in threads to slots in main thread

这里是Emit signal from pyQt Qthread

但它似乎在 PyQt5 中不起作用:/

【问题讨论】:

【参考方案1】:

只需在此处使用QThread.finished 信号即可。如果您完成线程,它将自动执行。 当然,您也可以根据需要定义自己的自定义信号。

from PyQt5.QtCore import pyqtSignal

class Main(QWidget):

    def __init__(self):
        super().__init__()

    def StartButtonEvent(self):
        self.test = ExecuteThread()
        self.test.start()
        self.test.finished.connect(thread_finished)
        self.test.my_signal.connect(my_event)

    def thread_finished(self):
        # gets executed if thread finished
        pass

    def my_event(self):
        # gets executed on my_signal 
        pass


class ExecuteThread(QThread):
    my_signal = pyqtSignal()

    def run(self):
        # do something here
        self.my_signal.emit()
        pass

【讨论】:

就是这么简单! :) 非常感谢! 我还能再问一个问题吗?我可以在这个信号中添加一些参数吗?或者有没有其他简单的程序如何实现它?例如在参数中发送一些 int 或 string 是的,添加参数很容易。只需查看Signals and Slots的官方 PyQt5 文档 在开始StartButtonEvent函数中,槽不应该被引用为self.thread_finishedself.my_event。尽管每个函数都可以用作插槽,但最好使用 @pyqtSlot() 装饰器。甚至它可能只是为了自我解释代码。 thread_finished 和 my_event 永远不会在我的计算机上从 ExecuteThread 触发。但是如果 self.my_signal.emit() 从 Main 类运行,则可以触发 my_event。有什么想法???

以上是关于PyQt5 - 如何从工作线程发出信号以通过 GUI 线程调用事件的主要内容,如果未能解决你的问题,请参考以下文章

PySide/PyQT5:如何从 QGraphicsItem 发出信号?

一旦第一组工作线程完成处理,我如何使用 AutoResetEventHandler 向主线程函数发出信号以再次启动线程

PyQt5 数据在字节类型的信号发射期间丢失

pyqt从线程线程发出信号

唤醒线程信号

发出 dataChanged 信号 PyQt5