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