PyQt从QThread关闭QMessageBox

2024-06-28 11:50:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个项目中尝试让qmessagebox以“accepted”条件退出,以响应传入的MIDI数据。MIDI输入库(游戏机.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方面的任何错误,我们将不胜感激。在


Tags: 数据selfif信号defmidiacceptqtgui
1条回答
网友
1楼 · 发布于 2024-06-28 11:50:38

midiInputDevice.poll()不应该是阻塞调用,因此线程在启动时运行一次并立即退出。。。很可能投票结果会是错误的,这就是为什么盒子会留在那里。在

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

相关问题 更多 >