阅读量:9
在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
槽函数,从而实现了线程间的跨调用对象。