2012-12-09 60 views
1

我试图从QRunnable发送信号到我的主要QObject,但由于某种原因,它没有收到它们。从QRunnable发射信号

这是正确的方法吗?

这里有一个小的测试案例:

import sys 

from PyQt4.QtGui import QApplication 
from PyQt4.QtCore import QThreadPool, QObject, QRunnable, pyqtSignal 

class WorkerSignals(QObject): 
    result = pyqtSignal(int) 

class Worker(QRunnable): 
    def __init__(self, task): 
     super(Worker, self).__init__() 

     self.task = task 
     self.signals = WorkerSignals() 

    def run(self): 
     print 'Sending', self.task 
     self.signals.result.emit(self.task) 

class Tasks(QObject): 
    def __init__(self): 
     super(Tasks, self).__init__() 

     self.pool = QThreadPool() 
     self.pool.setMaxThreadCount(1) 

    def process_result(self, task): 
     print 'Receiving', task # This does not run 

    def start(self): 
     for task in range(10): 
      worker = Worker(task) 
      worker.signals.result.connect(self.process_result) 

      self.pool.start(worker) 

     self.pool.waitForDone() 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 

    stuff = Tasks() 
    stuff.start() 
+0

为什么不使用'QThread'呢? – 2012-12-09 14:43:47

+1

@ X.Jacobs:因为我无法将QThread放入QThreadPool(它只接受QRunnables)。 – Blender

回答

3

你需要调用app.exec_()

当我们调用应用程序的exec_()方法,应用程序进入主循环。 主循环提取事件并将它们发送给对象。信号和插槽用于对象之间的通信。发生特定事件时发出信号。一个插槽可以是任何Python可调用的。当连接到它的信号被发射时,插槽被调用。

结账Events and Signals in PyQt4

+0

这是我的代码的简化版本。我的主应用程序更大,我打电话给'.exec _()'。 – Blender

+0

@Blender在这里你的代码运行如预期追加app.exec_()在文件末尾 – 2012-12-09 17:59:15

+0

嗯,我真的相信我把那条线放在那里。当我回家时,我会检查。 – Blender