我正在做一个项目,我试图让 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 方面的任何错误,将不胜感激。