0
我正在一个项目,我试图让QMesssageBox以“接受”条件退出,以响应传入的MIDI数据。 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方面的任何错误,那么将非常感激。
你确定'dataReceived'发射了吗?我试图复制你的代码和我的'QMessageBox'成功'接受'。 – Avaris 2012-04-19 07:09:42
@Avaris你是对的,我发布我的问题没有充分调查的事情!如果我删除了self.midiInputDevice.poll()条件,那么messageBox也会为我接受。问题必须存在于其他地方。 – Bitrex 2012-04-19 07:16:27