2012-12-09 58 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