日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PyQt5 笔记4 -- 多线程

發布時間:2025/3/12 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PyQt5 笔记4 -- 多线程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

PyQt5 筆記4 – 多線程


1、多線程

QT 程序的設計應該遵循UI線程與工作線程分離的原則,否則可能會因為工作線程運行時間太久造成程序未響應問題。如果程序有多個功能要同步執行,也必須另開線程執行。
QT 多線程的使用主要是通過 QThread 來實現。有兩種方法:一種是創建一個繼承自QThread的類并重寫它的run()方法;另一種是,創建類,實例化對象并轉換為線程對象。


2、重寫QThread的run()方法

創建一個繼承自QThread的類并重寫它的run()方法

# 創建視頻播放的線程類: class Thread(QThread):# 自定義信號show_signal = pyqtSignal(QImage)# 構造函數,接受參數def __init__(self, file_name, browser):QThread.__init__(self)self.video_name = file_nameself.browser = browser# 重寫run()方法def run(self):# 實例化一個讀取視頻對象cap = cv2.VideoCapture(self.video_name)while cap.isOpened():# 讀取視頻幀ret, frame = cap.read()# 獲取視頻的幀數fps = cap.get(cv2.CAP_PROP_FPS)if ret:# 轉換圖片格式rgb_image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)qt_image = QImage(rgb_image.data, rgb_image.shape[1], rgb_image.shape[0], QImage.Format_RGB888)p = qt_image.scaled(640, 480, Qt.KeepAspectRatio)# 發射信號self.show_signal.emit(p)time.sleep(1/fps)else:image = QImage('E:/11.jpg')self.browser.ui.lb_show.setPixmap(QPixmap.fromImage(image))self.browser.ui.lb_show.adjustSize()print('播放結束')break

使用創建的線程

# 實例化線程對象,并傳入參數。 th = Thread(file_name, self)# 綁定信號與槽 th.show_signal.connect(self.show_image)# 開啟線程 th.start()# 等待線程結束。括號內可填寫等待時間。 # th.wait() # 關閉線程 # th.quit()

node: 如果是在函數中實例化線程對象,要實例化為全局對象或者類對象,要不然函數結束后會銷毀資源,導致程序崩潰。


3、工作對象轉換為線程對象

創建一個繼承自QObject的類并寫一個想要運行的函數

class Worker(QObject):def __init__(self, parent=None):super(Worker, self).__init__(parent)def work(self):print('當前線程: %s' % hex(int(QThread.currentThreadId())))

實例化工作對象并轉換為線程對象

# 查看當前線程id print('主線程: %s' % hex(int(QThread.currentThreadId())))# 實例化線程對象 t = QThread()# 實例化工作類對象 worker = Worker()# 工作類對象轉化為線程對象 worker.moveToThread(t)# 綁定線程啟動信號的槽函數 t.started.connect(worker.work)# 啟動線程 t.start()

node: 如果不是通過啟動線程調用worker.work,而是直接調用worker.work這樣是不會開啟新線程的。


總結

以上是生活随笔為你收集整理的PyQt5 笔记4 -- 多线程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。