ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PySide6+Qt Design Studio可视化开发(五):多线程

PySide6+Qt Design Studio可视化开发(五):多线程 在PySide6中使用QThread将耗时任务移出主线程避免界面在任务执行期间卡死下面使用定时任务模拟后台耗时操作的运行情况。一、修改Backend.py增加子线程触发后将延迟3秒通知前端任务完成fromPySide6.QtCoreimportQObject,Slot,Signal,QTimer,Property,QThreadimporttime#新增Worker类在子线程干活classWorker(QObject):finishedSignal()Slot()defdo_work(self):#模拟耗时操作每次需要3秒完成time.sleep(3)self.finished.emit()classBackend(QObject):dataUpdatedSignal(int)#通知Worker开工taskRequestedSignal()#通知前端任务完成taskDoneSignal()def__init__(self):super().__init__()self._rootNoneself._count0self.num_map{0:零,1:一,2:二,3:三,4:四,5:五,6:六,7:七,8:八,9:九}self._timerQTimer(self)self._timer.setInterval(1000)self._timer.timeout.connect(self._tick)self._timer.start()#实例化子线程控制器self._threadQThread(self)#实例化Worker对象self._workerWorker()#将worker移到子线程self._worker.moveToThread(self._thread)#将Signal与函数连接#连接开始信号self.taskRequested.connect(self._worker.do_work)#连接结束信号self._worker.finished.connect(self._on_finished)#启动线程等待开始信号self._thread.start()Slot()defstart_task(self):self.taskRequested.emit()def_on_finished(self):self.taskDone.emit()defshutdown(self):self._thread.quit()#等待线程结束self._thread.wait(5000)二、修改前端界面绑定线程触发到按钮上接收到任务完成后播放一次变色动画Row{id: row x: 860 y: 413 width: 400 height: 400 anchors.horizontalCenter: parent.horizontalCenter#subButton不变Button{id: button objectName:subButtontext: qsTr(SUB)anchors.verticalCenter: parent.verticalCenter checkable: true Connections{target: button onClicked:{slider.value--animation.start()backend.sub_button_pressed(sub button pressed)}}}Slider{id: slider value: 0 anchors.verticalCenter: parent.verticalCenterfrom: 0 to: 9 stepSize: 1 Connections{target: backendfunctiononDataUpdated(msg){slider.value msg}#收到子线程结束信号画面闪烁一次functiononTaskDone(){animation1.start()}}}Button{id: button1 objectName:addButtontext: qsTr(ADD)anchors.verticalCenter: parent.verticalCenter checkable: true Connections{target: button1 onClicked:{slider.increase()animation1.start()backend.add_button_pressed()#点击后启动子线程backend.start_task()}}}}三、配置main.py主动关闭子线程exapp.exec()#主动关闭线程backend.shutdown()delengine四、运行结果
返回列表