【pyqt5】——信號與槽

一、簡單Demo

簡單使用信號和槽(之前常用的使用方式):

class DemoWin(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):self.resize(400, 250)self.btn = QPushButton("發送信號", self)# 發送一個clicked信號,綁定槽函數是self.onClick()self.btn.clicked.connect(self.onClick)# 添加窗口標題self.setWindowTitle("SignalDemo")# 槽函數,接收btn的clicked信號def onClick(self):self.btn.setText("接收到信號")self.btn.setStyleSheet("max-width:200px;min-width:200px;")

這是最簡單的信號和槽的使用方法,其中clicked事件是button的默認事件,我們將其綁定到自定義的onClick槽函數即可。

二、自定義信號Demo

?

# 導入信號
from PyQt5.QtCore import Qt, QObject, pyqtSignal# 自定義信號類
class MySignal(QObject):sendmsg = pyqtSignal(object)  # 定義一個信號,object表示傳遞一個參數(object是python中的基類)def run(self):self.sendmsg.emit("Hello PyQt5")  # 觸發信號,并傳遞一個string參數class MySlot(QObject):# 定義槽函數,接收一個string參數def slot(self, msg):print("接收到的信息是:", msg)if __name__ == '__main__':mySignal = MySignal()mySlot = MySlot()# 將信號和槽進行綁定mySignal.sendmsg.connect(mySlot.slot)#mySignal.sendmsg.disconnect(mySlot.slot)  # 斷開連接
# 觸發信號 mySignal.run() # 打印 "接收到的信息是: Hello PyQt5"

?

1)首先創建一個pyqtSignal信號實例(參數對應槽的參數的類型)

2)使用connect綁定信號和槽(使用后可以手工斷開連接,使用mySignal.sendmsg.disconnect(mySlot.slot))

3)觸發信號

三、信號傳遞數據(多個參數)

# 導入信號
from PyQt5.QtCore import Qt, QObject, pyqtSignal# 自定義信號類
class MySignal(QObject):sendmsg = pyqtSignal(object, int, dict)  # 定義一個信號,傳遞三個參數def run(self):self.sendmsg.emit("Hello PyQt5", 50, {"name": "leo"})  # 觸發信號,并傳遞三個參數,參數類型在信號定義時指定class MySlot(QObject):# 定義槽函數,接收一個string參數def slot(self, msg,age,name):print("接收到的信息是:", msg)print("接收到的年齡是:", age)print("接收到的名稱是:", name['name'])if __name__ == '__main__':mySignal = MySignal()mySlot = MySlot()# 將信號和槽進行綁定mySignal.sendmsg.connect(mySlot.slot)# 觸發信號mySignal.run()  # 打印 "接收到的信息是: Hello PyQt5"

?

可以看到,我們在定義信號的時候指定了對應槽函數的參數類型,并在觸發信號時傳入實際的參數,這樣槽函數就可以接受到數據了。

四、多對多綁定,綁定信號

信號和槽是可以N對N綁定的,也就是說在參數一致的情況下,一個信號可以綁定多個槽函數,一個槽函數也可以綁定多個信號。

信號還可以與信號綁定,例如B信號綁定了A信號,A信號和A槽函數綁定,則觸發B最終觸發A槽函數。

Demo:

?

# 導入信號
from PyQt5.QtCore import Qt, QObject, pyqtSignal# 自定義信號類
class MySignal(QObject):signal1 = pyqtSignal(object)signal2 = pyqtSignal(object,object)def __init__(self):super(MySignal, self).__init__()# signal1綁定多個槽函數(slot1和slot2)self.signal1.connect(self.slot1)self.signal1.connect(self.slot2)# signal2綁定signal1self.signal2.connect(self.signal1)self.signal1.emit(1)  # 觸發slot1和slot2self.signal2.emit(2,3)  # 雖然目前signal2和signal1綁定,但是signal2.emit的參數還是必須和signal定義時一致def slot1(self, num):print("slot1 " + str(num))def slot2(self, num):print("slot2 " + str(num))if __name__ == '__main__':mySignal = MySignal()

?

特別注意,signal2和signal1綁定后,槽函數的參數應該是signal1一致,而signal2.emit的參數應該是signal2定義時的參數類型一致。

signal2和signal1綁定時,觸發signal2的參數個數要多余signal1。例如signal1有一個int參數,那么singal2的第一個參數也必須是int,后面多的參數沒用。

上述代碼的輸出結果:

slot1 1
slot2 1
slot1 2  # 這里的2就是signal2傳遞給signal1的第一個參數,然后signal1將其傳遞給了slot1
slot2 2

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256047.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256047.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256047.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JSON - 簡介

JSON - 簡介 JSON實例 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鳥教程(runoob.com)</title> </head> <body> <h2>JavaScript 創建 JSON 對象</h2> <p> 網站名稱: <spa…

mysql慢日志管理

一、日志切割 原理&#xff1a; 1、cp一個慢日志備份 2、清空原理的慢日志 3、寫成腳本&#xff0c;每天一切&#xff0c;這樣就ok啦 二、查找日志中的慢日志 1、做了日志切割&#xff08;慢日志文件就小了&#xff09; 2、查找某個時間的慢日志 日志時間格式&#xff1a; # Ti…

【深度學習】mask_rcnn訓練自己的數據集以及模型使用(實踐結合GitHub項目)

根據requirements - 開源項目默認的.txt進行庫安裝 環境&#xff1a;WIN10 Anoconda Pycharm python3.6.2 mask_rcnn基本流程1、訓練 1)labelme進行目標物體標記&#xff0c;生成json文件&#xff0c;含點坐標、以及各個物體的標簽label; json文件的格式&#xff1a;&…

EXCEL小技巧:如何統計非空單元格

http://club.excelhome.net/thread-1187271-1-1.html 下面教大家如果用函數統計非空單元格的數量 首先我們來介紹幾個統計函數&#xff1a; 1.COUNT(value1,value2,...) 統計包含數字的單元格個數 2.COUNTA(value1,value2,...) 統計非空單元格的個數 3.COUNTBLANK(range&…

easyui 頁簽

昨天開始搭后臺框架&#xff0c;到晚上的時候遇到了一個現在覺得挺可笑但是當時一直很糾結很糾結的問題&#xff0c;這個問題剛剛解決出來&#xff0c;把它拿出來說說&#xff0c;讓自己長點兒記性&#xff0c;希望大家不要犯我這個錯誤啊 在backstage.jsp頁面中我寫了一個方法…

未在本地計算機上注冊“Microsoft.Jet.OLEDB.4.0”提供程序。

報錯信息&#xff1a; 解決方案&#xff1a; 1、“設置應用程序池默認屬性”/“常規”/”啟用32位應用程序”&#xff0c;設置為 true。 如下圖所示&#xff1a;&#xff08;已測試&#xff0c;好使&#xff09; 方法二&#xff1a;生成->配置管理器->平臺->點擊Any C…

UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figur

“UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure”在利用mask_rcnn進行物體檢測的時候出現的問題&#xff0c;主要是因為matplotlib的使用格式不對 可以檢查者兩個地方&#xff1a; 1、visualize.py中 import mat…

008. 限制上傳文件的大小

第一種方法: 利用web.config的配置文件項, 進行設置; 前端aspx示例: <% Page Language"C#" AutoEventWireup"true" CodeFile"sendOutEmail.aspx.cs" Inherits"sendOutEmail" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHT…

查詢實例及其代碼

一、 設有一數據庫&#xff0c;包括四個表&#xff1a;學生表&#xff08;Student&#xff09;、課程表&#xff08;Course&#xff09;、成績表&#xff08;Score&#xff09;以及教師信息表&#xff08;Teacher&#xff09;。四個表的結構分別如表1-1的表&#xf…

pyinstaller打包執行exe出現“ModuleNotFoundError: No module named ‘scipy.spatial.transform._rotation_group”

這個是因為打包后的第三方庫中缺少了pyd文件 具體的解決方法&#xff1a; 去環境下找到相應的py文件&#xff0c;根據https://blog.csdn.net/qq_41007606/article/details/109565069文章寫的方法&#xff0c;將py編譯成pyd文件&#xff0c;然后將pyd文件復制到dist相應的第三…

浙江中醫藥大學第十一屆程序設計競賽題解

官方題解&#xff1a;http://www.jnxxhzz.com/Article/article/9.html 2019: 特產 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 548 Solved: 154[Submit][Status][Web Board]Description Input Output 輸出一個整數表示dd帶回來的特產重量 Sample Input 2 3 6 1 3Sample …

vijos p1002——過河(noip2005提高組T2)

描述 在河上有一座獨木橋&#xff0c;一只青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子&#xff0c;青蛙很討厭踩在這些石子上。由于橋的長度和青蛙一次跳過的距離都是正整數&#xff0c;我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點&#xff1a;0&…

JNI學習

1. 目前調用關系已經搞清楚&#xff0c;需要編譯一個so或者dll的動態庫給java調用。 2. env有很多方法現在還不清楚&#xff0c; 獲得屬性句柄。 JNI方法描述符&#xff0c;主要就是在括號里放置參數&#xff0c;在括號后面放置返回類型&#xff0c;如下&#xff1a;&#xff0…

【項目實戰】——USB雙路繼電器電腦控制燈的開關(Python)

環境&#xff1a;window10、Python3.7.9 依賴庫&#xff1a;pyserial 硬件&#xff1a;220V燈帶、220V吊燈、USB雙路繼電器、電筆 1、安裝Python第三方庫pyserial 2、清楚插座的零火線&#xff08;用電筆去測試&#xff0c;燈亮為火線&#xff09; 3、清楚燈的零火線&#…

字符串去掉空格

2019獨角獸企業重金招聘Python工程師標準>>> String s1s.trim().replaceAll("\\s*", ""); 轉載于:https://my.oschina.net/u/2842177/blog/1587850

cntk-notes

cntk Embedding layer “Embedding” refers to representing words or other discrete items by dense continuous vectors. This layer assumes that the input is in one-hot form. E.g., for a vocabulary size of 10,000, each input vector is expected to have dimensio…

ubuntu安裝配置elasticSearch(vagrant)

安裝jdk sudo apt-get install python-software-properties sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracle-java8-installer sudo update-alternatives --config java 安裝elasticSearch mkdir /usr/local/elasticsearch/ su…

深入理解javascript函數進階系列第一篇——高階函數

前面的話 前面的函數系列中介紹了函數的基礎用法。從本文開始&#xff0c;將介紹javascript函數進階系列&#xff0c;本文將詳細介紹高階函數 定義 高階函數(higher-order function)指操作函數的函數&#xff0c;一般地&#xff0c;有以下兩種情況 1、函數可以作為參數被傳遞 2…

ANSYS WORKBENCH——參數化建模以及參數優化(結果導出為Excel)

目錄 1、打開軟件workbench 2、找到static structure,雙擊打開 3、選擇材料 4、參數化建模 ?

centos 安裝軟件

1&#xff09;一種是軟件的源代碼&#xff0c;您需要自己動手編譯它。這種軟件安裝包通常是用gzip壓縮過的tar包&#xff08;后綴為.tar.gz&#xff09;。2&#xff09;另一種是軟件的可執行程序&#xff0c;你只要安裝它就可以了。這種軟件安裝包通常被是一個RPM包&#xff08…