PyQt6基礎_QThread

目錄

前置

代碼:?

運行

正常運行

QThread運行報錯

?視頻


前置

1?PySide6.QtCore.QThread - Qt for Python?QThread官方文檔

2?長時間任務可以放到QThread中執行,避免占用主線程導致界面卡頓無法操作

代碼:?

import traceback,sys
from datetime import datetime
from time import sleep
from PyQt6.QtCore import (
Qt,
QSize,
QThread,
QTime,
QObject,
pyqtSignal,
pyqtSlot
)
from PyQt6.QtWidgets import (
QApplication,
QMainWindow,
QLabel,
QPushButton,
QVBoxLayout,
QWidget,
QMessageBox
)class Worker_000(QObject):signal_finished = pyqtSignal(str) # 任務結束信號signal_error = pyqtSignal(tuple) # 任務報錯信號signal_result = pyqtSignal(str) # 任務返回的結果@pyqtSlot(object)def do_work(self,task_data:dict):thread_name = task_data['thread_name']res_str = '執行結束了。'try:# work code startfor i in range(20):if i==10:raise ValueError('測試報錯功能')self.signal_result.emit(f"線程返回 第{i}次,當前時間為 {QTime.currentTime().toString('hh:mm:ss')} ")sleep(1)pass# work code endpassexcept:traceback.print_exc()exctype,value = sys.exc_info()[:2]self.signal_error.emit((thread_name,exctype,value,traceback.format_exc()))passelse:self.signal_result.emit(res_str)finally:self.signal_finished.emit(thread_name)passpassclass MainWindow(QMainWindow):signal_worker = pyqtSignal(object)def __init__(self):super().__init__()self.setWindowTitle('QThread')self.setMinimumSize(QSize(600,400))self.label_worker = QLabel()self.label_main = QLabel()self.btn = QPushButton('啟動QThread',clicked=self.btn_clicked)self.btn00 = QPushButton('主界面',clicked=self.btn00_clicked)layout = QVBoxLayout()layout.addWidget(self.label_worker)layout.addWidget(self.btn)layout.addWidget(self.btn00)layout.addWidget(self.label_main)widget = QWidget()widget.setLayout(layout)self.setCentralWidget(widget)self.open_init()passdef open_init(self):self.thread = Noneself.worker = Noneself.waitting_close = Falsepassdef btn_clicked(self):self.btn.setDisabled(True)self.worker = Worker_000()self.thread = QThread()self.thread.finished.connect(self.thread_finished)self.worker.signal_finished.connect(self.worker_signal_finished_emit)self.worker.signal_error.connect(self.worker_signal_error_emit)self.worker.signal_result.connect(self.worker_signal_results_emit)# 主線程與子線程之間的交互必須通過信號與槽進行,不要在主線程中通過 self.worker.do_woker()self.signal_worker.connect(self.worker.do_work)# 由于是通過 moveToThread 啟動 QThread.run() ,QThread不會自動發起finished信號,需要手動 quit或exit后才會發送finishedself.worker.moveToThread(self.thread)self.thread.start()task_data = {'thread_name':'worker_000'}self.signal_worker.emit(task_data)print('線程開始了。')passdef btn00_clicked(self):now_str = datetime.now().strftime('%Y-%m-%d %H:%M:%S')if self.thread:if self.thread.isRunning():res_str = '線程正在執行中...'else:res_str = '悠閑,哈哈哈'else:res_str = '無聊中。呵呵呵'self.label_main.setText(f"{now_str} {res_str}")passdef thread_finished(self):print('線程finished')self.btn.setDisabled(False)if self.waitting_close:self.close()passpassdef worker_signal_finished_emit(self,res:str):print(f'{res} 線程任務結束。')self.thread.quit()passdef worker_signal_error_emit(self,res:tuple):# (thread_name,type,value,traceback)pre_str = f"線程 {res[0]} 報錯啦。報錯信息 {res[-1]}"print(pre_str)QMessageBox.information(self,'提示',pre_str,QMessageBox.StandardButton.Ok)passdef worker_signal_results_emit(self,res:str):self.label_worker.setText(res)passdef closeEvent(self, a0):answer = QMessageBox.question(self,'確認退出?','退出將中斷操作,確定要退出么?',QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)if answer == QMessageBox.StandardButton.Yes:if self.thread:if self.thread.isRunning():self.waitting_close = Trueself.thread.quit()a0.ignore()QMessageBox.information(self,'提示','正在關閉線程,請稍等',QMessageBox.StandardButton.Ok)passelse:a0.accept()else:a0.accept()else:a0.ignore()passif __name__ == '__main__':app = QApplication([])mw = MainWindow()mw.show()app.exec()pass

1?主線程與QThread之間的交互必須通過信號與槽進行

2?Work_000類是要子線程執行的任務,使用?moveToThread?方法調用QThread。注意:使用moveToThread方法調用QThread,QThread不會自主發射finished信號,需要手動quit或exit才會發射finished信號。所以在主線程接收到?Work_000 signal_finished表示任務完成的信號時,手動將QThread?quit或exit

3?存在QThread的程序需要考慮一種情況,就是在QThread還在執行中時,關閉主界面(主線程)的情況。所以,定義了一個?waitting_close?布爾變量,如果發生QThread還在執行,但發起關閉主界面的請求時,將?waitting_close設置為True。在?QThread?發射finished信號后,檢查?watting_close?是否為True,如果為True,就將主界面關閉。

運行

正常運行

控制臺打印

QThread啟動后,“啟動QThread"按鈕不可用。QThread執行過程中,”主界面“按鈕可以正常使用。

QThread執行結束后,QThread發射finished信號,“啟動QThread"按鈕恢復可用狀態。

QThread運行報錯

?

控制臺打印

?視頻

PyQt6基礎_QThread_嗶哩嗶哩_bilibili?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903329.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903329.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903329.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot 應用運行指南

🚀 Spring Boot 應用運行指南 ?? 使用 Maven 🔧 運行命令 $ mvn spring-boot:run? 啟動效果 . ____ _ __ _ _/\\ / ____ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | _ | _| | _ \/ _ | \ \ \ \\\/ ___)| |_)| | | | | || (_…

jeecgboot 3.8.0 集成knife4j問題一文解決

問題描述: ? 在cloud環境下,若應用系統配置了context-path,則無法通過網關進入后臺接口管理系統 原因分析: ? 查看請求信息發現少拼接了系統的context-path,導致無法正確請求到數據。直接使用正確的地址可以正常通過網關訪問。故此確定為集成knife4j的問題。 解決辦法…

【Flutter】Flutter + Unity 插件結構與通信接口封裝

關聯文檔:【方案分享】Flutter Unity 跨平臺三維渲染架構設計全解:插件封裝、通信機制與熱更新機制—— 支持 Android/iOS/Web 的 3D 內容嵌入與遠程資源管理,助力 XR 項目落地 —— 支持 Android/iOS/Web 的 3D 內容嵌入與遠程資源管理&…

推薦 1 款 9.3k stars 的全景式開源數據分析與可視化工具

Orama 是一個開源的數據分析與可視化項目,由askorama團隊開發和維護。該項目旨在為用戶提供一套強大而易用的工具集,幫助用戶輕松處理和理解大規模數據,通過創建交互式且引人入勝的數據可視化圖表,揭示隱藏在數據背后的深層次洞察…

關于windows API 的鍵鼠可控可測

相關函數解釋 GetAsyncKeyState 是 Windows API 中的一個函數,用于判斷某個虛擬鍵是否被按下。GetAsyncKeyState(VK_ESCAPE) 專門用于檢測 Esc 鍵的狀態。下面為你詳細介紹其用法: 函數原型 cpp SHORT GetAsyncKeyState( int vKey ); 參數 vKey&a…

vs 安裝完番茄助手visual assist 后 菜單欄不顯示

vs 安裝完番茄助手visual assist 后 菜單欄不顯示 出現原因解決辦法: 出現原因 vs安裝完番茄助手后,不顯示。主要原因是之前安裝過,但是試用過期了,卸載后重新安裝然后替換破解版的dll 導致的。 解決辦法: 關閉vs軟件…

論文導讀 - 基于邊緣計算、集成學習與傳感器集群的便攜式電子鼻系統

基于邊緣計算、集成學習與傳感器集群的便攜式電子鼻系統 原論文地址:https://www.sciencedirect.com/science/article/abs/pii/S0925400522015684 引用此論文(GB/T 7714-2015): WANG T, WU Y, ZHANG Y, et al. Portable electr…

EasyCVR視頻匯聚平臺助力大型生產監控項目攝像機選型與應用

一、方案背景 在300路大型生產監控項目中,由于生產環境復雜多樣,涵蓋室外廠區、大型車間、室內辦公區域等不同場景,單一類型的攝像機難以滿足全方位、精細化的監控需求。EasyCVR作為一款功能強大的視頻融合管理平臺,具備靈活的視…

測試用例介紹

文章目錄 一、測試用例基本概念1.1 測試用例基本要素 二、測試用例的設計方法2.1 基于需求的設計方法2.2 等價類2.3 邊界值2.4 錯誤猜測法2.6 場景設計法2.7 因果圖2.5 正交排列 三、綜合:根據某個場景去設計測試用例(萬能公式)四、如何使用F…

基于藍牙Beacon人員導航方案

基于藍牙Beacon人員導航方案 一、室內定位市場痛點與技術選擇 大型商場(單層超2萬㎡)和醫院(科室超200個)的復雜空間中,傳統GPS信號衰減超90%,用戶平均尋路耗時10-15分鐘,30%購物決策因“找店…

使用vue3 腳手架創建項目

1.創建項目 并 運行 1.1 創建項目 vue create abcd 1.2 運行 創建好項目后,命令行會提示你運行項目 npm run serve 2.介紹各個目錄 node_modules : 項目依賴包,其中包括很多基礎依賴,自己也可以根據需要安裝其他依賴 assets文件夾&a…

跨語言哈希一致性:C# 與 Java 的 MD5 之戰?

在跨平臺或異構系統集成的場景中,我們經常需要在不同的編程語言之間交換數據或驗證數據一致性。MD5 作為一種廣泛使用的哈希算法,就常常扮演著生成唯一標識或校驗數據完整性的角色。然而,不少開發者可能會遇到這樣一個令人困惑的問題&#xf…

基于RuoYi的WMS倉庫管理系統源碼級解決方案

基于RuoYi的WMS倉庫管理系統源碼級解決方案 項目地址 一、系統簡介 WMS(Warehouse Management System)倉儲管理系統是現代物流管理的核心系統,通過對倉庫業務的精細化管理,實現入庫、出庫、庫存等環節的高度自動化和智能化。 系…

研究:大模型輸出一致性:確定性與隨機性的場景化平衡

大模型在相同輸入下的輸出是否一致,本質上取決于其設計目標、任務性質以及技術實現方式。這一問題需要從技術原理、應用場景、用戶需求三個維度進行深度分析: 一、技術實現:確定性與隨機性的平衡 模型架構的確定性基礎 大模型的核心參數(如權重矩陣)在訓練完成后是固定的…

青年座談會的讀書匯報

今天,單位組織了一個五四青年座談會,我們室由于大家都在出差忙之類的,我必須要參加,還要我做一個匯報,我一新來的還沒深入到研發工作中,于是決定寫了一篇簡單的讀書筆記,再用deepseek潤色一下&a…

RabbitMQ安裝流程(Windows環境)

安裝資料鏈接:https://download.csdn.net/download/ly1h1/90705840?spm1001.2014.3001.5503 代碼案例鏈接:https://download.csdn.net/download/ly1h1/90706521 1.下載依賴,Downloads - Erlang/OTP 2.下載RabbitMQ安裝包,In…

vscode 使用gitcode團隊管理項目

1、下載安裝vscode https://code.visualstudio.com/Download 2、安裝git 3、在vscode中安裝GitLens插件 4、打開終端 點擊會顯示當前更改的項目 5、提交更改的文件,會提示輸入用戶名、密碼,這里的密碼即是令牌,令牌在第一次創建的時候顯…

el-input限制輸入只能是數字 限制input只能輸入數字

方法一&#xff1a; 通過設置type屬性&#xff1a;type“number”&#xff0c;這種方式一般會影響樣式&#xff0c;不建議使用&#xff0c;如下圖&#xff1a; <el-input type"number" v-model"aaa"></el-input>方法二&#xff1a; 通過綁定值…

【Python數據驅動決策】數據分析與可視化全流程實戰指南

目錄 前言技術背景與價值當前技術痛點解決方案概述目標讀者說明一、技術原理剖析核心概念圖解核心作用講解關鍵技術模塊說明技術選型對比二、實戰演示環境配置要求核心代碼實現案例1:銷售數據清洗案例2:月度銷售趨勢分析案例3:產品關聯分析(熱力圖)運行結果驗證三、性能對…

Spring的BeanFactory和FactoryBean的區別

? ?BeanFactory和FactoryBean在Spring框架中扮演著不同的角色&#xff0c;具有不同的功能和用途。? 定義與角色 ?BeanFactory?&#xff1a;BeanFactory是Spring IoC容器的核心接口&#xff0c;用于管理和維護Bean的定義、創建和生命周期。它是Spring IoC容器的基礎&…