pyqt5

pyqt5线程跨调用对象怎么实现

小亿
101
2023-11-04 11:58:55
栏目: 编程语言

在PyQt5中,要实现跨线程调用对象,可以使用QMetaObject.invokeMethod()方法。这个方法可以在指定的对象上调用一个槽函数,并将参数传递给它。

下面是一个示例,演示了如何在PyQt5中实现线程间的跨调用对象:

from PyQt5.QtCore import QObject, QThread, pyqtSignal, pyqtSlot, QMetaObject
from PyQt5.QtWidgets import QApplication

# 子线程类
class Worker(QThread):
    def __init__(self):
        super().__init__()

    def run(self):
        # 模拟耗时操作
        self.sleep(5)
        
        # 发送信号通知主线程
        self.emitSignal.emit('Hello from worker thread')

# 主线程类
class MainWindow(QObject):
    emitSignal = pyqtSignal(str)

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

    @pyqtSlot(str)
    def onEmitSignal(self, msg):
        print(msg)

    def startWorkerThread(self):
        self.worker = Worker()
        self.worker.emitSignal.connect(self.onEmitSignal)
        self.worker.start()

if __name__ == '__main__':
    app = QApplication([])
    mainWindow = MainWindow()

    # 在主线程中调用子线程的槽函数
    QMetaObject.invokeMethod(mainWindow, 'startWorkerThread', Qt.QueuedConnection)

    app.exec_()

在这个示例中,Worker类表示一个子线程,MainWindow类表示主线程。在Worker类中,使用emitSignal信号向主线程发送消息。在MainWindow类中,使用onEmitSignal槽函数接收并处理这个消息。

在主线程中,我们使用QMetaObject.invokeMethod()方法调用startWorkerThread槽函数,并指定连接类型为Qt.QueuedConnection,表示在主线程的事件循环中调用这个槽函数。

当子线程完成耗时操作后,会发射emitSignal信号,然后这个信号会被连接到主线程的onEmitSignal槽函数,从而实现了线程间的跨调用对象。

0
看了该问题的人还看了