2012-04-19 130 views
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方面的任何错误,那么将非常感激。

+1

你确定'dataReceived'发射了吗?我试图复制你的代码和我的'QMessageBox'成功'接受'。 – Avaris 2012-04-19 07:09:42

+0

@Avaris你是对的,我发布我的问题没有充分调查的事情!如果我删除了self.midiInputDevice.poll()条件,那么messageBox也会为我接受。问题必须存在于其他地方。 – Bitrex 2012-04-19 07:16:27

回答

1

midiInputDevice.poll()不应该是一个阻塞的调用,所以你的线程运行一次,开始时立即退出......并且可能轮询调用将返回false,这就是为什么该框停留在那里。

您将不得不使用midiInputDevice.read()(应该阻止),或者循环轮询设备,直到出现一些数据。