2017-02-03 53 views
0

在已在从This AnswerPyQt - 如何模拟信号?或者其他解决方案?

from PyQt5.QtWidgets import * 
from PyQt5.QtCore import * 
from PyQt5.QtGui import * 
import time 

class MyWorker(QObject): 

    @pyqtSlot() 
    def firstWork(self): 
     print ('doing first work') 
     time.sleep(2) 
     print ('first work done') 

    @pyqtSlot() 
    def secondWork(self): 
     print ('doing second work') 
     time.sleep(2) 
     print ('second work done') 

class Window(QWidget): 
    def __init__(self, parent = None): 
     super(Window, self).__init__() 

     self.initUi() 
     self.setupThread() 

    def initUi(self): 
     layout = QVBoxLayout() 
     self.button1 = QPushButton('1') 
     self.button2 = QPushButton('2') 
     layout.addWidget(self.button1) 
     layout.addWidget(self.button2) 
     self.setLayout(layout) 
     self.show() 

    def setupThread(self): 
     self.thread = QThread() 
     self.worker = MyWorker() 

     self.worker.moveToThread(self.thread) 

     self.button2.clicked.connect(self.worker.secondWork) 
     self.button1.clicked.connect(self.worker.firstWork) 

     # Start thread 
     self.thread.start()  

if __name__ == "__main__": 
    app = QApplication([]) 
    w = Window() 
    app.exec_() 

一切完美修改了代码,但我想通过简单的代码行通过事件信号,开始在单独的线程的方法,而不是。

是否有如何执行此操作?

喜欢的东西self.worker.secondWork(),而不是事件从按钮self.button2.clicked.connect(self.worker.secondWork) (当然,这不作品)

我有我的技术发现的唯一方法是创建隐藏的按钮和模拟他的单击事件这一点,但它不是当然很好的解决方案!

+0

您链接到的问题已经为您提供了解决此问题的代码,所以我不确定为什么您从示例中删除了该代码。你所需要做的就是将'thread.started'信号连接到两个工人插槽。没有必要连接按钮,因为你没有发送任何东西回工人。 – ekhumoro

+0

我不知道这个信号可以很容易地在相反的方向工作 –

回答

0

我已经通过添加自定义PyQt信号解决了这个问题。

from PyQt5.QtWidgets import * 
from PyQt5.QtCore import * 
from PyQt5.QtGui import * 
import time 

class MyWorker(QObject): 

    @pyqtSlot() 
    def firstWork(self): 
     print ('doing first work') 
     time.sleep(2) 
     print ('first work done') 

    @pyqtSlot() 
    def secondWork(self): 
     print ('doing second work') 
     time.sleep(2) 
     print ('second work done') 

class Window(QWidget): 

    Signal = pyqtSignal() 

    def __init__(self, parent = None): 
     super(Window, self).__init__() 

     self.initUi() 
     self.setupThread() 

    def initUi(self): 
     layout = QVBoxLayout() 
     self.button1 = QPushButton('1') 
     self.button2 = QPushButton('2') 
     layout.addWidget(self.button1) 
     layout.addWidget(self.button2) 
     self.setLayout(layout) 
     self.show() 

    def setupThread(self): 
     self.thread = QThread() 
     self.worker = MyWorker() 

     self.worker.moveToThread(self.thread) 

     self.Signal.connect(self.worker.secondWork) 
     self.Signal.connect(self.worker.firstWork) 

     self.thread.start() 
     self.Signal.emit() 

if __name__ == "__main__": 
    app = QApplication([]) 
    w = Window() 
    app.exec_() 
相关问题