簡體   English   中英

PyQt-從QThread關閉QMessageBox

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM