2012-04-19 128 views
0

我正在一個項目,我試圖讓QMesssageBox以「接受」條件退出,以響應傳入的MIDI數據。 MIDI輸入庫(pygame.midi)需要輪詢輸入以查看是否有數據到達,因此我啓動了一個QThread來處理這個問題,並在數據到達緩衝區時發出「dataReceived」信號。然後我這個信號連接到QMessageBox提示的接受()槽:PyQt - 從QThread關閉QMessageBox

def midiLearn(self, mainWindowInstance, widget): 


    class midiLearnWait(QtCore.QThread): 

     dataReceived = QtCore.pyqtSignal() 

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

     def run(self): 
      if self.midiInputDevice.poll(): 
       self.dataReceived.emit() 

    if self.midiInputDevice: 
     midiLearnMessage = QtGui.QMessageBox(1, 'MIDI Learn', 'Please move a controller.', 
                 QtGui.QMessageBox.Cancel) 
     midiInputThread = midiLearnWait(self.midiInputDevice) 
     #just trigger accept for testing 
     midiInputThread.dataReceived.connect(lambda: midiLearnMessage.accept())    
     midiInputThread.start()    
     ret = midiLearnMessage.exec_() 
     if ret == QtGui.QMessageBox.Cancel: 
      return 
    else: 
     QtGui.QMessageBox.warning(mainWindowInstance, 'MIDI Error', 'No MIDI input selected.') 

不幸的是,這似乎並沒有工作 - 當MIDI數據被髮送到該程序的消息框,永遠不會被接受。如果問題與我如何配置MIDI庫或者我如何完成這個GUI代碼有關,那麼我現在還不完全確定。如果任何人都可以指出我試圖設置代碼的GUI方面的任何錯誤,那麼將非常感激。

+1

你確定'dataReceived'發射了嗎?我試圖複製你的代碼和我的'QMessageBox'成功'接受'。 – Avaris 2012-04-19 07:09:42

+0

@Avaris你是對的,我發佈我的問題沒有充分調查的事情!如果我刪除了self.midiInputDevice.poll()條件,那麼messageBox也會爲我接受。問題必須存在於其他地方。 – Bitrex 2012-04-19 07:16:27

回答

1

midiInputDevice.poll()不應該是一個阻塞的調用,所以你的線程運行一次,開始時立即退出......並且可能輪詢調用將返回false,這就是爲什麼該框停留在那裏。

您將不得不使用midiInputDevice.read()(應該阻止),或者循環輪詢設備,直到出現一些數據。