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