我用QT和Python写了一个小应用程序。我按下一个按钮,等待串行输入5秒钟。我有几个标签想要更新,例如,当我按下按钮时,它应该更改为“开始阅读”,当我返回时,它应该更改为“阅读完成”。我使用了一个简单的线程,它调用processEvents,但它不会更新,当read函数完成时,我看到最后一个标签更改。
class MyWindow(QtGui.QMainWindow):
def __init__(self):
print 'myWindow'
super(MyWindow, self).__init__()
uic.loadUi('test1.ui', self)
QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL ('clicked()'), self.buttonStartClicked)
self.show()
def buttonStartClicked(self):
thread = threading.Thread(target = self.update_gui, args = ())
thread.daemon = True
thread.start()
self.label.setText('Starting Test')
response = sRS232_Con.read()
#QtGui.QApplication.processEvents()
self.label.setText('Ending Test')
def update_gui(self):
while True :
QtGui.QApplication.processEvents()
print 'update'
time.sleep(1)
def main():
app = QtGui.QApplication(sys.argv)
window = MyWindow()
sys.exit(app.exec_())
if __name__ == '__main__':
main()发布于 2015-11-05 23:06:57
在Qt中,由某个事件循环管理的任何QObject都不应该被其他线程接触(至少在没有任何保护的情况下)。
如果由于某种原因您不能使用为串行端口提供异步QSerialPort库,则可以将QThread用于由Qt信号和插槽管理的单独线程。
QtGui的事件由主线程(在循环app.exec_()的内部)分派。另一个QThread可以与串口一起工作,它可以在'Starting Test'和'Ending Test'上发出信号。这些信号可以连接到能够更新主线程中的UI的MyWindow插槽。
https://stackoverflow.com/questions/33523285
复制相似问题