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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

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

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

有時候在項目開發(fā)時,經(jīng)常會遇到一些耗時操作導(dǎo)致界面遲緩卡頓,為了解決這個問題,可以創(chuàng)建多線程,使用主線程更新界面使用子線程實時處理數(shù)據(jù),最后將結(jié)果顯示到界面上。

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

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

在使用線程時可以直接得到Thread實例,調(diào)用其start()函數(shù)即可啟動線程,線程啟動之后,會自動調(diào)用其實現(xiàn)的run()函數(shù),該方法就是線程的執(zhí)行函數(shù)業(yè)務(wù)的線程任務(wù)就寫在run()函數(shù)中,當(dāng)run()退出之后線程就基本結(jié)束了。

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

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

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

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

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

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

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

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

信號描述
started在開始執(zhí)行run函數(shù)之前,從相關(guān)線程發(fā)射此信號
finished當(dāng)程序完成業(yè)務(wù)邏輯時,從相關(guān)線程發(fā)射此信號

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

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

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

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

實現(xiàn)代碼如下所示:

from PyQt5.QtCore import QThread ,  pyqtSignal,  QDateTime 
from PyQt5.QtWidgets import QApplication,  QDialog,  QLineEdit
import time
import sysclass BackendThread(QThread):# 通過類成員對象定義信號對象  update_date = pyqtSignal(str)# 處理要做的業(yè)務(wù)邏輯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):# 創(chuàng)建線程  self.backend = BackendThread()# 連接信號 self.backend.update_date.connect(self.handleDisplay)# 開始線程  self.backend.start()#將當(dāng)前時間輸出到文本框def handleDisplay(self, data):self.input.setText(data)if __name__ == '__main__':app = QApplication(sys.argv)win = Window()win.show() sys.exit(app.exec_())

運行效果如下所示:


參考資料、拓展學(xué)習(xí):

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

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

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。