1. 程式人生 > >pyqt signal slot thread 多執行緒

pyqt signal slot thread 多執行緒

        訊號(singal)與槽(slot)用於物件相互通訊,訊號:當某個物件的某個事件發生時,觸發一個訊號,槽:響應指定訊號的所做的反應,其實訊號槽類似於.NET裡面的委託、事件,比如Repeater控制元件類,當行資料繫結後,觸發一個ItemDataBound事件,不管使用者使用會監聽該事件並做額外處理,其控制元件類內部都會觸發該事件,這種機制很多程度提高了類的封裝性和完整性。
  PyQt的窗體控制元件類已經有很多的內建訊號,開發者也可以新增自己的自定義訊號,訊號槽有如下特點:
    - 一個訊號可以連線到許多插槽。
    - 一個訊號也可以連線到另一個訊號。
    - 訊號引數可以是任何Python型別。
    - 一個插槽可以連線到許多訊號。
    - 連線可能會直接(即同步)或排隊(即非同步)。
    - 連線可能會跨執行緒。
    - 訊號可能會斷開

  (以上幾條特點翻譯於官方文件),接下來,我將以若干個例項,來體現以上幾個特點。

內建訊號槽的使用

  1. from PyQt5.QtWidgets import *  
  2. from PyQt5.QtCore 
    import *  
  3. def sinTest():  
  4.     btn.setText("按鈕文字改變")  
  5. app = QApplication([])  
  6. main = QWidget()  
  7. main.resize(200,100)  
  8. btn = QPushButton("按鈕文字",main)  
  9. ##按鈕btn的內建訊號連線名為sinTest的槽
  10. btn.clicked.connect(sinTest)  
  11. main.show()  
  12. app.exec_()  

自定義訊號槽的使用

  1. class SinClass(QObject):  
  2.     ##宣告一個無引數的訊號
  3.     sin1 = pyqtSignal()  
  4.     ##宣告帶一個int型別引數的訊號
  5.     sin2 = pyqtSignal(int)  
  6.     ##宣告帶一個int和str型別引數的訊號
  7.     sin3 = pyqtSignal(int,str)  
  8.     ##宣告帶一個列表型別引數的訊號
  9.     sin4 = pyqtSignal(list)  
  10.     ##宣告帶一個字典型別引數的訊號
  11.     sin5 = pyqtSignal(dict)  
  12.     ##宣告一個多過載版本的訊號,包括了一個帶int和str型別引數的訊號,以及帶str引數的訊號
  13.     sin6 = pyqtSignal([int,str], [str])  
  14.     def __init__(self,parent=None):  
  15.         super(SinClass,self).__init__(parent)  
  16.         ##訊號連線到指定槽
  17.         self.sin1.connect(self.sin1Call)  
  18.         self.sin2.connect(self.sin2Call)  
  19.         self.sin3.connect(self.sin3Call)  
  20.         self.sin4.connect(self.sin4Call)  
  21.         self.sin5.connect(self.sin5Call)  
  22.         self.sin6[int,str].connect(self.sin6Call)  
  23.         self.sin6[str].connect(self.sin6OverLoad)  
  24.         ##訊號發射
  25.         self.sin1.emit()  
  26.         self.sin2.emit(1)  
  27.         self.sin3.emit(1,"text")  
  28.         self.sin4.emit([1,2,3,4])  
  29.         self.sin5.emit({"name":"codeio","age":"25"})  
  30.         self.sin6[int,str].emit(1,"text")  
  31.         self.sin6[str].emit("text")  
  32.     def sin1Call(self):  
  33.         print("sin1 emit")  
  34.     def sin2Call(self,val):  
  35.         print("sin2 emit,value:",val)  
  36.     def sin3Call(self,val,text):  
  37.         print("sin3 emit,value:",val,text)  
  38.     def sin4Call(self,val):  
  39.         print("sin4 emit,value:",val)  
  40.     def sin5Call(self,val):  
  41.         print("sin5 emit,value:",val)  
  42.     def sin6Call(self,val,text):  
  43.         print("sin6 emit,value:",val,text)  
  44.     def sin6OverLoad(self,val):  
  45.         print("sin6 overload emit,value:",val)  
  46. sin = SinClass()  
執行結果:
sin1 emit
sin2 emit,value: 1
sin3 emit,value: 1 text
sin4 emit,value: [1, 2, 3, 4]
sin5 emit,value: {'age': '25', 'name': 'codeio'}
sin6 emit,value: 1 text
sin6 overload emit,value: text

訊號槽N對N連線、斷開連線

  1. from PyQt5.QtWidgets import *  
  2. from PyQt5.QtCore import *  
  3. class SinClass(QObject):  
  4.     ##宣告一個無引數的訊號
  5.     sin1 = pyqtSignal()  
  6.     ##宣告帶一個int型別引數的訊號
  7.     sin2 = pyqtSignal(int)  
  8.     def __init__(self,parent=None):  
  9.         super(SinClass,self).__init__(parent)  
  10.         ##訊號sin1連線到sin1Call和sin2Call這兩個槽
  11.         self.sin1.connect(self.sin1Call)  
  12.         self.sin1.connect(self.sin2Call)  
  13.         ##訊號sin2連線到訊號sin1
  14.         self.sin2.connect(self.sin1)  
  15.         ##訊號發射
  16.         self.sin1.emit()  
  17.         self.sin2.emit(1)  
  18.         ##斷開sin1、sin2訊號與各槽的連線
  19.         self.sin1.disconnect(self.sin1Call)  
  20.         self.sin1.disconnect(self.sin2Call)  
  21.         self.sin2.disconnect(self.sin1)  
  22.         ##訊號sin1和sin2連線同一個槽sin1Call
  23.         self.sin1.connect(self.sin1Call)  
  24.         self.sin2.connect(self.sin1Call)  
  25.         ##訊號再次發射
  26.         self.sin1.emit()  
  27.         self.sin2.emit(1)  
  28.     def sin1Call(self):  
  29.         print("sin1 emit")  
  30.     def sin2Call(self):  
  31.         print("sin2 emit")  
  32. sin = SinClass()  
執行結果:
sin1 emit
sin2 emit
sin1 emit
sin2 emit
sin1 emit
sin1 emit

多執行緒訊號槽通訊

  1. from PyQt5.QtWidgets import *  
  2. from PyQt5.QtCore import *  
  3. class Main(QWidget):  
  4.     def __init__(self, parent = None):  
  5.         super(Main,self).__init__(parent)  
  6.         ##建立一個執行緒例項並設定名稱、變數、訊號槽
  7.         self.thread = MyThread()  
  8.         self.thread.setIdentity("thread1")  
  9.         self.thread.sinOut.connect(self.outText)  
  10.         self.thread.setVal(6)  
  11.     def outText(self,text):  
  12.         print(text)  
  13. class MyThread(QThread):  
  14.     sinOut = pyqtSignal(str)  
  15.     def __init__(self,parent=None):  
  16.         super(MyThread,self).__init__(parent)  
  17.         self.identity = None
  18.     def setIdentity(self,text):  
  19.         self.identity = text  
  20.     def setVal(self,val):  
  21.         self.times = int(val)  
  22.         ##執行執行緒的run方法
  23.         self.start()  
  24.     def run(self):  
  25.         whileself.times > 0andself.identity:  
  26.             ##發射訊號
  27.             self.sinOut.emit(self.identity+" "+str(self.times))  
  28.             self.times -= 1
  29. app = QApplication([])  
  30. 相關推薦

    pyqt signal slot thread 執行

            訊號(singal)與槽(slot)用於物件相互通訊,訊號:當某個物件的某個事件發生時,觸發一個訊號,槽:響應指定訊號的所做的反應,其實訊號槽類似於.NET裡面的委託、事件,比如Repeater控制元件類,當行資料繫結後,觸發一個ItemDataBound事件,不管使用者使用會監聽該事件並做額

    提交訂單效能優化系列之006-普通的Thread執行改為Java8的parallelStream併發流

    概括總結 Java8的parallelStream併發流能達到跟多執行緒類似的效果,但它也不是什麼善茬,為了得到跟上一版本的多執行緒類似的效果,一改再改,雖然最後改出來了,但是還是存在理解不了的地方。

    Java Thread 執行 操作執行

    建立、啟動執行緒 執行緒的實現方式 執行緒的生命週期 執行緒的狀態 控制執行緒 5、執行緒的建立和啟動 A、繼承Thread類或實現Runnable介面,重寫或實現run方法,run方法代表執行緒要完成的任務 B、建立Thread子類或是Ru

    【Boost】boost庫中thread執行詳解5——談談執行中斷

    執行緒不是在任意時刻都可以被中斷的。如果將執行緒中函式中的sleep()睡眠等待去掉,那麼即使在主執行緒中呼叫interrupt()執行緒也不會被中斷。 thread庫預定義了若干個執行緒的中斷點,只有當執行緒執行到中斷點的時候才能被中斷,一個執行緒可以擁有任意多箇中斷點。

    【Boost】boost庫中thread執行詳解3——細說lock_guard

    boost::lock_guard可以說是一種比boost::unique_lock輕量級的lock, 簡單一些場景可以用它就行了。 看看它的原始碼也很簡單:template<typename Mutex> class lock_guard { private:

    【Boost】boost庫中thread執行詳解1

    1. 概述 執行緒就是,在同一程式同一時間內允許執行不同函式的離散處理佇列。 這使得一個長時間去進行某種特殊運算的函式在執行時不阻礙其他的函式變得十分重要。 執行緒實際上允許同時執行兩種函式,而這兩個函式不必相互等待。 一旦一個應用程式啟動,它僅包含一個預設執行緒。 此執行

    Java-thread執行

    程序與執行緒 程序是作業系統資源分配的基本單位,每個程序都有獨立的程式碼和資料空間(程式上下文),程式之間的切換會有較大的開銷;在作業系統中能同時執行多個程序(程式);系統在執行的時候會為每個程序分配不同的記憶體空間;沒有執行緒的程序可以看做是單執行緒的,如果一個程序內有多個執行緒,則執

    Thread 執行 等待 回撥函式 獲取返回值

    Thread 是1.1版本時候的執行緒 它預設是前臺執行緒 前臺執行緒:程序關閉後,執行緒還會執行完 無引數多執行緒 Console.WriteLine("主執行緒開始");

    【Boost】boost庫中thread執行詳解1——thread入門與簡介

    1. 概述 執行緒就是,在同一程式同一時間內允許執行不同函式的離散處理佇列。 這使得一個長時間去進行某種特殊運算的函式在執行時不阻礙其他的函式變得十分重要。 執行緒實際上允許同時執行兩種函式,而這兩個函式不必相互等待。一旦一個應用程式啟動,它僅包含一個預設執行緒。 此執

    .NET進階篇06-async非同步、thread執行2

    知識需要不斷積累、總結和沉澱,思考和寫作是成長的催化劑 內容目錄 一、執行緒Thread1、生命週期2、後臺執行緒3、靜態方法1.執行緒本地儲存2.記憶體柵欄4、返回值二、執行緒池ThreadPool1、工作佇列2、工作執行緒和IO執行緒3、和Thread區別4、定時器 一、執行緒Threa

    .NET進階篇06-async非同步、thread執行3

    知識需要不斷積累、總結和沉澱,思考和寫作是成長的催化劑 梯子 一、任務Task1、啟動任務2、阻塞延續3、任務層次結構4、列舉引數5、任務取消6、任務結果7、異常二、並行Parallel1、Parallel.For()、Parallel.ForEach()2、Parallel.For3、Par

    .NET進階篇06-async非同步、thread執行4

    知識需要不斷積累、總結和沉澱,思考和寫作是成長的催化劑 梯子 一、鎖1、lock2、Interlocked3、Monitor4、SpinLock5、Mutex6、Semaphore7、Events1、AutoResetEvent2、ManualResetEvent3、ManualResetEv

    Python 執行 thread join() 的作用

    原文地址 在 Python 的多執行緒程式設計中,在例項程式碼中經常有 thread1.join()這樣的程式碼。那麼今天咱們用實際程式碼來解釋一下 join 函式的作用。   join的原理就是依次檢驗執行緒池中的執行緒是否結束,沒有結束就阻塞直到執行緒結束,如果結束則跳轉執行下一

    socket區域網 通過執行Thread)將pygame得到的攝像頭影象傳給客戶端

    該專案是在 https://blog.csdn.net/dss_dssssd/article/details/82848512 專案基礎上新增socket傳輸影象的功能。 這個小專案檔案比較多,就先放在github上了, 專案地址:https://github.com/MengRe/

    Android執行分析之一:使用Thread非同步下載影象

    Android多執行緒分析之一:使用Thread非同步下載影象 羅朝輝 (http://blog.csdn.net/kesalin) CC 許可,轉載請註明出處 打算整理一下對 Android Framework 中多執行緒相關知識的理解,主要集中在 Fra

    java 執行學習(Java中Thread 和 Runnable的區別)

    今天剛學習java多執行緒 在網上查了幾篇博文學習,個人覺得寫的不錯,但是有的地方有個疑問:Java中Thread 和 Runnable的區別。 然後,在網上查詢相關資料,發現幾乎都是一樣的。 下面貼出相關的程式碼: 如果一個類繼承Thread,則不適合資源共享。但是如果實現了

    32-執行--概述+Thread類+執行的建立方式(繼承Thread類+實現Runnable介面)+Runnable介面+執行的名稱+執行的狀態

    一、概述 1、程序:對應的是一個應用程式在記憶體中的所屬空間。程序是不直接執行的,它只是在分配該應用程式的記憶體空間 注:如果一個程式在記憶體中開闢了空間,就代表它在執行。不執行要釋放空間 2、執行緒:程序中的一個負責程式執行的控制單元,也叫執行路徑。一個程序中可以有多個執行路徑,稱之為

    C++執行之std::thread

    C++11,包含標頭檔案 thread.h,並使用名稱空間std。 thread類提供的方法 方法 描述 thread 建構函式,在這裡傳入執行緒執行函式,和函式引數

    Java併發程式設計(6):Runnable和Thread實現執行的區別(含程式碼)

    Java中實現多執行緒有兩種方法:繼承Thread類、實現Runnable介面,在程式開發中只要是多執行緒,肯定永遠以實現Runnable介面為主,因為實現Runnable介面相比繼承Thread類有如下優勢: 1、可以避免由於Java的單繼承特性而帶來的侷限; 2、增強程式的健壯性,程式碼能夠被多個執行

    執行設計模式:第四篇 - Thread-Per-Message模式和Worker-Thread模式

    一,Thread-Per-Message模式         Thread-Per-Message模式是說為每個請求都分配一個執行緒,由這個執行緒來執行處理。這裡包含兩個角色,請求的提交執行緒和請求的執行執行緒。