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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Python Qt GUI设计:多线程中信号与槽的使用(基础篇—9)

發布時間:2023/11/27 生活经验 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python Qt GUI设计:多线程中信号与槽的使用(基础篇—9) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有時候在項目開發時,經常會遇到一些耗時操作導致界面遲緩卡頓,為了解決這個問題,可以創建多線程,使用主線程更新界面使用子線程實時處理數據,最后將結果顯示到界面上。

PyQt多線程將使用QThread函數,QThread是Qt的線程類中最核心的底層類。由于PyQt的的跨平臺特性,QThread要隱藏所有與平臺相關的代碼要使用的QThread開始一個線程,可以創建它的一個子類,然后覆蓋其它QThread.run()函數。

PyQt的線程使用非常簡單:建立一個自定義的類(如thread),自我繼承自QThread ,并實現其run()方法即可。

在使用線程時可以直接得到Thread實例,調用其start()函數即可啟動線程,線程啟動之后,會自動調用其實現的run()函數,該方法就是線程的執行函數業務的線程任務就寫在run()函數中,當run()退出之后線程就基本結束了。

QThread有started和finished信號,可以為這兩個信號指定槽函數,在線程啟動和結束之時執行一段代碼進行資源的初始化和釋放操作,更靈活的使用方法是:在自定義的QThread實例中自定義信號,并將信號連接到指定的槽函數,當滿足一定的業務條件時發射此信號。

QThread類中的常用方法如下表所示:

方法描述
start()啟動線程
wait()

阻止線程,直到滿足如下條件之一。

1、與此QThread對象關聯的線程已完成執行(即從run返回時),如果線程完成執行,此函數返回True,如果線程尚未啟動,也返回True;

2、等待時間的單位是毫秒,如果時間是ULONG_MAX(默認值·),則等待,永遠不會超時(線程必須從run返回),如果等待超時,此函數將會返回False

sleep()強制當前線程睡眠多少秒

QThread類中的常用信號如下表所示:

信號描述
started在開始執行run函數之前,從相關線程發射此信號
finished當程序完成業務邏輯時,從相關線程發射此信號

QThread的簡單使用如以下代碼所示:

class Thread(QThread):     #繼承QThreaddef __init__(self):super(Thread,self).__init__()def run(self):#線程相關的代碼passs#創建一個新的線程
thread=Thread()
#啟動線程
thread.start()

通過一個小案例來了解QThread多線程的使用吧。本例中,定義了一個后臺線程類BackendThread來模擬后臺耗時操作,在這個線程類中定義了信號update_date。使用 BackendThread 線程類在后臺處理數據,每秒發射一次自定義信號update_date。

在初始化窗口界面時,定義后臺線程類BackendThread,并把線程類的信號update_date連接到槽函數handleDisplay()。這樣后臺線程每發射一次信號,就可以把最新的時間值實時顯示在前臺窗口的QLineEdit文本對話框中。

實現代碼如下所示:

from PyQt5.QtCore import QThread ,  pyqtSignal,  QDateTime 
from PyQt5.QtWidgets import QApplication,  QDialog,  QLineEdit
import time
import sysclass BackendThread(QThread):# 通過類成員對象定義信號對象  update_date = pyqtSignal(str)# 處理要做的業務邏輯def run(self):while True:data = QDateTime.currentDateTime()currTime = data.toString("yyyy-MM-dd hh:mm:ss")self.update_date.emit( str(currTime) )time.sleep(1)class Window(QDialog):def __init__(self):QDialog.__init__(self)self.setWindowTitle('PyQt5界面實時更新例子')self.resize(400, 100)self.input = QLineEdit(self)self.input.resize(400, 100)self.initUI()def initUI(self):# 創建線程  self.backend = BackendThread()# 連接信號 self.backend.update_date.connect(self.handleDisplay)# 開始線程  self.backend.start()#將當前時間輸出到文本框def handleDisplay(self, data):self.input.setText(data)if __name__ == '__main__':app = QApplication(sys.argv)win = Window()win.show() sys.exit(app.exec_())

運行效果如下所示:


參考資料、拓展學習:

多線程(Qtimer和Qthread),網頁交互(QWebEngineView,js與python的交互)

PyQt5高級界面控件之QThread(十二)?

總結

以上是生活随笔為你收集整理的Python Qt GUI设计:多线程中信号与槽的使用(基础篇—9)的全部內容,希望文章能夠幫你解決所遇到的問題。

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