Python Qt GUI设计:多线程中信号与槽的使用(基础篇—9)
有時候在項目開發(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(默認(rèn)值·),則等待,永遠(yuǎn)不會超時(線程必須從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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python Qt GUI设计:QTim
- 下一篇: 和12岁小同志搞创客开发:如何驱动LED