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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python Qt GUI设计:QTim
- 下一篇: 和12岁小同志搞创客开发:如何驱动LED