我正在开发一个项目,我试图让QMesssageBox以“已接受”状态退出以响应传入的MIDI数据。 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方面的任何错误,那将非常感激。
答案 0 :(得分:1)
midiInputDevice.poll()
不应该是一个阻塞调用,所以你的线程在启动时运行一次并立即退出...并且轮询调用可能会返回false,这就是盒子停留在那里的原因。
你要么必须使用midiInputDevice.read()
(应该阻止),要么循环轮询设备,直到有一些数据。