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方面的任何錯誤,那麼將非常感激。
你確定'dataReceived'發射了嗎?我試圖複製你的代碼和我的'QMessageBox'成功'接受'。 – Avaris 2012-04-19 07:09:42
@Avaris你是對的,我發佈我的問題沒有充分調查的事情!如果我刪除了self.midiInputDevice.poll()條件,那麼messageBox也會爲我接受。問題必須存在於其他地方。 – Bitrex 2012-04-19 07:16:27