2012-04-19 12 views
0

私は、受信したMIDIデータに応じて「受け入れられた」状態で終了するQMesssageBoxを取得しようとしているプロジェクトに取り組んでいます。 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'を正常に' accept'sを複製しようとしました。 – Avaris

+0

@Avarisあなたが正しいです、私は完全に調査することなく私の質問を投稿しました!私がself.midiInputDevice.poll()の条件を削除した場合、messageBoxも私のために受け入れます。問題は他の場所にあるはずです。 – Bitrex

答えて

1

はブロッキングコールであってはならないので、スレッドは起動時に一度実行され、すぐに終了します。おそらくポーリング呼び出しはfalseを返します。そのため、ボックスはそこに残ります。 (ブロックする必要があります)を使用するか、または何らかのデータがあるまでループでデバイスをポーリングする必要があります。

関連する問題