PyQt5 - 如何从工作线程发射信号以调用GUI线程的事件

4

正如标题所述,如何做到这一点?

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在线程中发出信号以连接主线程中的槽从pyQt QThread触发信号,但似乎在PyQt5中不起作用:/。
1个回答

8
在这里,只需使用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

那太简单了! :) 非常感谢你! - Erik Šťastný
我可以再问一个问题吗?我能在这些信号中添加一些参数吗?或者有没有其他简单的方法来实现它?例如,发送一些整数或字符串作为参数。 - Erik Šťastný
1
是的,添加参数很容易。只需查看官方PyQt5文档中的信号和槽部分即可。 - MrLeeh
1
StartButtonEvent函数的开头,插槽不应该被引用为self.thread_finishedself.my_event吗?虽然每个函数都可以用作插槽,但最好使用@pyqtSlot()装饰器。即使只是为了自我解释代码也是一个好主意。 - user_na
1
thread_finished和my_event从ExecuteThread中无法被触发,但如果从Main类中运行self.my_signal.emit(),则可以触发my_event。有什么想法吗??? - sangorys

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接