PyQt - 从QThread关闭QMessageBox

时间:2012-04-19 06:46:59

标签: python pyqt midi

我正在开发一个项目,我试图让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方面的任何错误,那将非常感激。

1 个答案:

答案 0 :(得分:1)

midiInputDevice.poll()不应该是一个阻塞调用,所以你的线程在启动时运行一次并立即退出...并且轮询调用可能会返回false,这就是盒子停留在那里的原因。

你要么必须使用midiInputDevice.read()(应该阻止),要么循环轮询设备,直到有一些数据。