[英]PyQt - Closing QMessageBox from a QThread
我正在一个项目中,尝试响应收到的MIDI数据,使QMesssageBox以“接受”条件退出。 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方面的任何错误,将不胜感激。
midiInputDevice.poll()
不应是阻塞调用,因此您的线程在启动时运行一次,然后立即退出...并且可能轮询调用将返回false,这就是框保留在其中的原因。
您将不得不使用midiInputDevice.read()
(应该阻止),或者循环轮询设备,直到有一些数据为止。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.