Python 在pyqt中将辅助对象移动到QThread之前设置信号和插槽

Python 在pyqt中将辅助对象移动到QThread之前设置信号和插槽,python,pyqt,pyqt5,qthread,qobject,Python,Pyqt,Pyqt5,Qthread,Qobject,在Qt/PyQt中,我使用一个Worker类和一个QThread来创建线程 self.worker = Worker() self.thread = QThread() worker.moveToThread(thread) setup_signal_slot_with_main_object() // start thread.start() 我必须在moveToThread()之后将安装程序\u信号\u插槽\u与\u main\u object()一起放置。但我有一个复杂的工人。在W

在Qt/PyQt中,我使用一个Worker类和一个QThread来创建线程

self.worker = Worker()
self.thread = QThread()

worker.moveToThread(thread)
setup_signal_slot_with_main_object()

// start 
thread.start()
我必须在moveToThread()之后将安装程序\u信号\u插槽\u与\u main\u object()一起放置。但我有一个复杂的工人。在Worker._uuu_uuu_uu()中,它创建许多QObject并连接内部信号和插槽。我不想创建一个在worker->moveToThread(&thread)之后创建所有连接和调用worker.setup\u signal\u slot()的方法,因为worker包含许多子QObject,每个QObject都可以在其构造函数中创建signal/slot

在Qt/C++中,我可以在worker的构造函数中进行信号/插槽连接。但在PyQt中,插槽不会在新线程中运行

这是一个示例,其中一个Worker包含一个QTimer

导入系统 输入信号 导入线程 从PyQt5.QtCore导入QObject、pyqtSignal、QTimer、QCoreApplication、QThread 导入日期时间 班级工作人员(QObject): timeChanged=pyqtSignal(对象) def uuu init uuu(self,parent=None): QObject.\uuuuu init\uuuuu(自,父) self.timer=QTimer(self) 自动定时器设置间隔(1000) #我想在这里接通 self.timer.timeout.connect(self.main\u进程) def启动(自): #self.timer.timeout.connect(self.main\u进程) self.timer.start() 打印('Worker-thread{}:Start-timer'。格式(threading.get_-ident()) #此方法仍在主线程中运行 def主流程(自): timestamp=datetime.datetime.now() 打印('Worker-thread{}:{}'。格式(threading.get_-ident(),timestamp.strftime(“%d-%m-%Y%H-%m-%S”)) self.timeChanged.emit(时间戳) 类WorkerThread(QObject): def uuu init uuu(self,parent=None): QObject.\uuuuu init\uuuuu(自,父) self.emitter=Worker() self.thread=QThread(self) self.emitter.moveToThread(self.thread) self.thread.start.connect(self.emitter.start) self.thread.finished.connect(self.emitter.deleteLater) self.emitter.timeChanged.connect(self.show\u time) def启动(自): self.thread.start() def停止(自): 如果self.thread.isRunning(): self.thread.quit() self.thread.wait() 打印('退出线程') def显示时间(自身、时间戳): 打印('Main thread{}:{}'。格式(threading.get_ident(),timestamp.strftime(“%d-%m-%Y%H-%m-%S”)) def信号处理器(信号,帧): 打印('退出') app.quit() 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': signal.signal(signal.SIGINT,信号处理器) signal.signal(signal.SIGTERM,信号处理器) app=QCoreApplication(sys.argv) 计时器=QTimer() timer.timeout.connect(lambda:None) 定时器启动(500) 打印('Main thread{}'。格式(threading.get_ident()) 发射器=WorkerThread() emitter.start() sys.exit(app.exec_()) 在Worker中,计时器超时将调用主线程中的main_进程。我可以将self.timer.timeout.connect(self.main\u进程)移动到worker.start()方法中。但正如我上面所说的,我仍然希望在其构造函数中放置内部信号/插槽。
有人能给我一个解决方案吗?谢谢

如果希望在接收方使用decorator的同一线程中调用方法,如果不这样做,则将在发送方的线程中调用

导入系统 输入信号 导入线程 导入日期时间 从PyQt5.QtCore导入QObject、pyqtSignal、QTimer、QCoreApplication、QThread、pyqtlot 班级工作人员(QObject): timeChanged=pyqtSignal(对象) def uuu init uuu(self,parent=None): QObject.\uuuuu init\uuuuu(自,父) self.timer=QTimer(self) 自动定时器设置间隔(1000) self.timer.timeout.connect(self.main\u进程) @pyqtSlot() def启动(自): self.timer.start() 打印(“工作线程{}:启动计时器”。格式(threading.get_ident()) @pyqtSlot() def主流程(自): timestamp=datetime.datetime.now() 印刷品( “工作线程{}:{}”。格式( threading.get_ident(),timestamp.strftime(“%d-%m-%Y%H-%m-%S”) ) ) self.timeChanged.emit(时间戳) 类WorkerThread(QObject): def uuu init uuu(self,parent=None): QObject.\uuuuu init\uuuuu(自,父) self.emitter=Worker() self.thread=QThread(self) self.emitter.moveToThread(self.thread) self.thread.start.connect(self.emitter.start) self.thread.finished.connect(self.emitter.deleteLater) self.emitter.timeChanged.connect(self.show\u time) @pyqtSlot() def启动(自): self.thread.start() def停止(自): 如果self.thread.isRunning(): self.thread.quit() self.thread.wait() 打印(“退出线程”) @pyqtSlot(对象) def显示时间(自身、时间戳): 印刷品( “主线程{}:{}”。格式( threading.get_ident(),timestamp.strftime(“%d-%m-%Y%H-%m-%S”) ) ) def信号处理器(信号,帧): 打印(“退出”) app.quit() 如果名称=“\uuuuu main\uuuuuuuu”: signal.signal(signal.SIGINT,信号处理器) signal.signal(signal.SIGTERM,信号处理器) app=QCoreApplication(sys.argv) 计时器=QTimer() timer.timeout.connect(lambda:None) 定时器启动(500) 打印(“主线程{}”。格式(threading.get_ident()) 发射器=WorkerThread() emitter.start() sys.exit(app.exec_()) 输出:

Main    thread 140175719339648
Worker thread 140175659480832: Start timer
Worker thread 140175659480832: 26-07-2019 04-39-42
Main   thread 140175719339648: 26-07-2019 04-39-42
Worker thread 140175659480832: 26-07-2019 04-39-43
Main   thread 140175719339648: 26-07-2019 04-39-43
Worker thread 140175659480832: 26-07-2019 04-39-44
Main   thread 140175719339648: 26-07-2019 04-39-44
Worker thread 140175659480832: 26-07-2019 04-39-45
Main   thread 140175719339648: 26-07-2019 04-39-45

非常感谢你!我误解了任何python方法都是slot。我应该将@pyqtSlot添加到我的所有插槽中,特别是对于多线程程序。