PyQt5多線程之信號與槽的使用

2022-01-01 糙科技
文章:Python數據分析實例

本次分享主要介紹PyQt5多線程中信號與槽的使用示例。

QThread類是PyQt5中核心線程類,通過創建QThread類的子類並重寫其run()方法來實現一個線程。

QThread類常用方法及說明

方法

說明

start()

啟動線程

run()

線程的起點,調用start()方法之後,新創建的線程將調用該方法

wait()

阻塞線程

sleep()

以秒為單位休眠線程

msleep()

以毫秒為單位休眠線程

usleep()

以微妙為單位休眠線程

quit()

退出線程

exit()

退出線程的事件循環,如果返回0表示成功

terminate()

強制終止線程

setPriority()

設置線程優先級,取值:

1、QThread.IdlePriority,空閒優先級

2、QThread.LowestPriority,最低優先級

3、QThread.LowPriority,低優先級

4、QThread.NormalPriority,系統默認優先級

5、QThread.HighPriority,高優先級

6、QThread.HighestPriority,最高優先級

7、QThread.TimeCriticalPriority,儘可能頻繁地分配執行

8、QThread.InheritPriority,默認用與創建線程相同的優先級

isFinished()

是否完成

isRunning()

是否正在運行

QThread類常用信號

1、started:在調用run()方法之前,相關線程開始執行時從該線程發射

2、finished:在相關線程完成執行之前從該線程發射

簡單示例:

from PyQt5.QtCore import QThreadfrom PyQt5.QtWidgets import *
class Thread(QThread): def __init__(self): super(Thread, self).__init__()
def run(self): n=0 while True: n=n+1 print("列印輸出:",n) Thread.sleep(1) if n==8: Thread.quit()
if __name__=='__main__': import sys app=QApplication(sys.argv) thread=Thread() thread.start() sys.exit(app.exec_())
列印輸出:1列印輸出:2列印輸出:3列印輸出:4列印輸出:5列印輸出:6列印輸出:7列印輸出:8

多線程信號與槽使用示例:

from PyQt5.QtCore import QThread, pyqtSignal, QDateTimefrom PyQt5.QtWidgets import QApplication, QDialog, QLineEditimport timeimport sys
class Thread(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("當前時間:%s" % 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.set_UI()
def set_UI(self): self.backend = Thread() 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_())



以上創建數據更新業務類Thread,然後自定義信號pyqtSignal,通過該信號的emit()方法將數據更新業務類動態發送給窗口的相應槽函數來實現數據的傳遞更新。

- 合作、交流、轉載請添加微信 moonhmily1 -

相關焦點

  • PyQt 5信號與槽的幾種高級玩法
    信號與槽的連接方式可以是同步連接,也可以是異步連接。信號與槽的連接可能會跨線程。信號可能會斷開。在GUI編程中,當改變一個控制項的狀態時(如單擊了按鈕),通常需要通知另一個控制項,也就是實現了對象之間的通信。在早期的GUI編程中使用的是回調機制,在Qt中則使用一種新機制——信號與槽。
  • Qt線程之moveToThread
    上一篇我們通過子類化QThread的方式實現了多線程。這一次將使用另一種方式實現多線程,那就是通過moveToThread將對象移動到子線程(不知道這樣表達是否準確,反正意思差不多)。moveToThread是QObject的成員函數,那麼QObject又是誰?.....連大名鼎鼎的QObject都不知道,面壁一下先。
  • java 信號與槽專題及常見問題 - CSDN
    QT信號/槽在我的理解中,QT和Android都是類似的開發框架,都是由開發團隊封裝了各式各樣的接口和數據結構.將一些問題的解決方法簡單化 比如QT中將線程封裝為QThread,派生類通過重寫run方法來將代碼投入到新的線程執行,而同樣的Android中的線程是Java自帶的Thread
  • c++信號與槽專題及常見問題 - CSDN
    download.csdn.net/download/u012372584/131624962、直接編譯會有錯誤,需要對源碼中的一句進行更改:將第419行 :typedef sender_set::const_iterator const_iterator; 更改為:typedef typename sender_set::const_iterator const_iterator;3、使用
  • Linux Qt使用POSIX多線程條件變量、互斥鎖(量)
    嘎嘎之前一直在看POSIX的多線程編程,上個周末結合自己的理解,寫了一個基於Qt的用條件變量同步線程的例子。故此來和大家一起分享,希望和大家一起交流。提到線程,如果在UI編程中,總會和一些耗時操作聯繫在一起。
  • Qt——線程與定時器
    接下來,每隔一段時間,定時器便會發出一次timeout()信號。更多用法這裡就不講了,您可以自行參考官方文檔。比如如何停止、如何令定時器只運行一次等。二、在多線程中使用QTimer1.錯誤用法您可能會這麼做:子類化QThread,在線程類中定義一個定時器,然後在run()方法中調用定時器的start()方法。
  • Python GUI編程之PyQt5入門到實戰
    類的實例 app = QApplication(sys.argv) # 創建一個主窗口 mainWindow = QMainWindow() # 創建Ui_MainWindow的實例 ui = MainWinBuddyLayout.Ui_MainWindow() # 調用setupUi在指定窗口(主窗口)中添加控制項
  • 信號與槽專題及常見問題 - CSDN
    槽函數分為三種類型,即 public slots、private slots 和 protected slots。public slots:在這個區內聲明的槽意味著任何對象都可將信號與之相連接。protected slots:在這個區內聲明的槽意味著當前類及其子類可以將信號與之相連接。
  • Python Qt GUI設計:QTimer計時器類、QThread多線程類和事件處理類(基礎篇—8)
    一般情況下,應用程式都是單線程運行的
  • C#多線程開發-線程間通訊
    ,有時候當主線程分配的任務過多或做一些需要長時間等待和響應的工作時單獨使用子線程來實現可能更好,可是當我們程序中的子線程太多的時候,有些需求就需要在線程之間進行通訊或者傳遞消息。簡單解釋就是非終止狀態下子線程在使用AutoResetEvent在方法WainOne時需要等待AutoResetEvent的信號,否則不往下繼續執行,無信號則一直等待。終止狀態就是無需等待直接可以順序執行。
  • (5)嵌入式QT多線程的簡單實現(方法一)
    https://blog.csdn.net/czyt1988/article/details/64441443        在嵌入式Linux應用程式的開發過程中,多線程永遠是一個不可逃避的話題。多線程的出現,可以使一些任務處理更加方便快捷。使用多線程,可以把原來複雜龐大的系統任務,分解成多個獨立的任務模塊,方便開發人員管理,使程序架構更加緊湊,更加穩定。
  • Linux 多線程詳解 —— 什麼是線程
    即:獲取線程ID和主線程ID的值:用戶態系統調用mm_struct對應的結構線程IDpid_t gettid(void)pid_t pid進程IDpid_t getpid(void)pid_t tgid但是獲取該gettid系統調用接口並沒有被封裝起來,如果確實需要獲取線程ID,可使用:#include<sys/syscall.h>
  • python高級進階 002第一個pyqt5程序
    pyqt5開發程序。app.exec_()主要作用是用死循環來監聽界面的關閉按鈕等界面控制項等事件__name__在本文件運行的時候,結果就是__main__使用__name__==『__main__『來模擬python程序主入口為了使得我們能夠對qtdesigner設計後生成的代碼更加熟悉,我們今後會更多直接使用純pyqt5代碼來編寫程序,當然,在熟悉以後,我們可以直接使用qtdesigner直接快速圖形化開發界面
  • PyQt5信號和槽
    當然,通過本文學習,只要大家對信號和槽有個初步認識就可以了,後續的學習中會不斷用到這些知識,所以可以在後面的內容中,邊學習邊理解。一、信號和槽在Qt中,不同的控制項之間的通信,是通過信號和槽來實現的。比如,當一個按鈕控制項被按下的時候,會發送一個信號,我們可以把這個信號和一個函數連接起來。
  • QT高級編程技巧(二)-- 編寫多線程和並發應用
    一般地,我們在主線程上構建界面對象,然後進入事件循環以處理控制項繪製、用戶輸入、系統輸出等消息。這就是我們通常說的事件驅動模型。主線程承擔著用戶交互的重任,當在主線程上運行費時的代碼時,就會影響用戶的正常操作。所以我們常把一些費時費力的計算工作移出主線程,開闢新的線程來運行之。
  • Python高級進階 007 pyqt5消息盒子QMessageBox
    一、知識回顧1.使用類進行pyqt5的gui開發封裝2.使用setGeometry函數:大小、位置3.掌握類的繼承與內部調用本節知識視頻教程QMessageBox看看常見的不同的圖標的消息類別:帶有圖標的消息盒子,圖標可以是問號question,信息information,警告warning注意:使用消息盒子後,最後會返回一個按鈕類型的結果,這個結果也是我們人機互動的結果。
  • 編程思想之多線程與多進程
    的確,進程與線程有著千絲萬縷的關係,下面就讓我們一起來理一理:1.線程是程序執行的最小單位,而進程是作業系統分配資源的最小單位;2.一個進程由一個或多個線程組成,線程是一個進程中代碼的不同執行路線;3.進程之間相互獨立,但同一進程下的各個線程之間共享程序的內存空間(包括代碼段、數據集、堆等)及一些進程級的資源(如打開文件和信號),某進程內的線程在其它進程不可見
  • 好課分享:PyQt5基礎入門
    .mp4  33.94M|   |   ├──課時021.修改控制項的Tab順序.mp4  18.78M|   |   ├──課時022.在QtDesigner中完成信號與槽的設置.mp4  65.94M|   |   ├──課時023.在QtDesigner中為窗口添加菜單和工具欄.mp4  42.93M|   |   ├──課時024.創建主窗口
  • iOS多線程全套:線程生命周期,多線程的四種解決方案,線程安全問題,GCD的使用,NSOperation的使用(下)
    NSOperation實現多線程的步驟如下:1. 創建任務:先將需要執行的操作封裝到NSOperation對象中。2. 創建隊列:創建NSOperationQueue。3. 將任務加入到隊列中:將NSOperation對象添加到NSOperationQueue中。
  • Qt多個信號連接同一個槽的方法
    Qt的信號/槽機制給我們編程帶來了很大的便利。在多數的情況下,我們只需要一個信號對應一個槽就可以了。但有時候我們也會遇到多個信號對應一個槽的情況。比如說做一個計算器的小程序,界面上有10個按鈕分別對應0 - 9這幾個數字。按下這幾個按鈕處理的邏輯是類似的,所以我們完全沒有必要為每一個按鈕都寫一個槽來對應按鈕按下的信號。