0

私は、着信MIDIデータに応答してQMesssageBoxを「受け入れられた」状態で終了させようとしているプロジェクトに取り組んでいます。MIDI入力ライブラリ(pygame.midi)は、データが到着したかどうかを確認するために入力をポーリングする必要があるため、これを処理するためにQThreadを開始し、データがバッファーに到着したときに「dataReceived」信号を出力します。次に、このシグナルをQMessageBoxのaccept()スロットに接続します。

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の側面を設定しようとした方法の誤りを誰かが指摘できれば、それは大いにありがたいことです。

4

1 に答える 1

1

midiInputDevice.poll()ブロッキング呼び出しであってはならないので、スレッドは開始時に一度実行され、すぐに終了します...おそらくポーリング呼び出しは false を返すため、ボックスはそこにとどまります。

(ブロックする必要があります)を使用するmidiInputDevice.read()か、データが存在するまでループでデバイスをポーリングする必要があります。

于 2012-04-30T16:57:55.960 に答える