python GUI庫圖形界面開發(fā)之PyQt5信號與槽基礎使用方法與實例
信號與槽有三種使用方法
第一種:內(nèi)置信號與槽的使用
第二種:自定義信號與槽的使用
第三種:裝飾器的信號與槽的使用
一: 內(nèi)置信號與槽的使用
內(nèi)置信號與槽的使用,是指在發(fā)射信號時,使用窗口控件的函數(shù),而不是自定義的函數(shù),這種也是我們前面用的最多的,下面簡單的一個實例,大家就會明白
import sys
from PyQt5.QtWidgets import QMessageBox,QPushButton,QApplication,QWidget
app=QApplication(sys.argv)
widget=QWidget()
def showMsg():
QMessageBox.information(widget,'信息提示框','Ok 彈出測試信息')
btn=QPushButton('測試點擊按鈕',widget)
btn.clicked.connect(showMsg)
widget.show()
sys.exit(app.exec_())
運行腳本,顯示效果如下


這個例子將一個按鈕對象的內(nèi)置clicked信號與自定義槽函數(shù)showMsg()連接,單擊按鈕,就會觸發(fā)這個槽函數(shù),彈出一個信息提示框
二:自定義信號與槽的使用
自定義信號與槽的使用,是指在發(fā)射信號時,不使用窗口控件的函數(shù),而是使用自定義的函數(shù),(簡單的說就是使用oyqtsSignal類實例發(fā)射信號),之所以要使用自定義的信號與槽,是因為通過內(nèi)置函數(shù)發(fā)射信號有自身的缺陷,首先,內(nèi)置函數(shù)只包含一些常用地信號,有些信號發(fā)射找不到對應的內(nèi)置函數(shù),其次在特定的情況下,才能發(fā)射此信號,如按鈕的點擊事件,最后,內(nèi)置函數(shù)傳遞的參數(shù)是特定的,不可以自定義,使用自定義的信號與槽函數(shù)則沒有這些缺陷
在pyqt5中,自定義信號與槽的適用很靈活,比如因為業(yè)務需要,在程序中的某些地方需要發(fā)射一個信號,傳遞多種數(shù)據(jù),然后在槽函數(shù)接受這些數(shù)據(jù),這樣就可以很靈活的實現(xiàn)一些業(yè)務邏輯
簡單的一個實例:簡單的自定義信號與槽
from PyQt5.QtCore import QObject,pyqtSignal
#信號對象
class QTypeSignal(QObject):
#定義一個信號
# sendmsg = pyqtSignal(object)
#todo 優(yōu)化 多個參數(shù)傳遞
sendmsg=pyqtSignal(str,str)
def __init__(self):
super(QTypeSignal, self).__init__()
def run( self ):
#發(fā)射信號
#self.sendmsg.emit('hell')
#todo 優(yōu)化 發(fā)射多個參數(shù)
self.sendmsg.emit('第一參數(shù)','第二個參數(shù)')
#槽對象
class QTypeSlot(QObject):
def __init__(self):
super(QTypeSlot, self).__init__()
#槽對象中的槽函數(shù)
# def get( self,msg ):
# print("QSlot get msg => " + msg)
#todo 優(yōu)化 多個參數(shù)
def get( self,msg1,msg2 ):
print("QSlot get msg => " + msg1+' '+msg2)
if __name__ == '__main__':
#實例化信號對象
send=QTypeSignal()
#實例化槽對象
slot=QTypeSlot()
#1
print('_____-把信號綁定到槽函數(shù)上_____')
send.sendmsg.connect(slot.get)
send.run()
print('_____-把信號與槽函數(shù)解綁_____')
send.sendmsg.disconnect(slot.get)
send.run()

信號與槽連接的主要步驟如下
第一步:生成一個信號
#定義一個信號
# sendmsg = pyqtSignal(object)
#todo 優(yōu)化 多個參數(shù)傳遞
sendmsg=pyqtSignal(str,str)
第二步:將信號與槽函數(shù)連接起來
print('_____-把信號綁定到槽函數(shù)上_____')
send.sendmsg.connect(slot.get)
第三步:槽函數(shù)接受數(shù)據(jù)
def get( self,msg1,msg2 ):
print("QSlot get msg => " + msg1+' '+msg2)
第四步:發(fā)射信號的實現(xiàn)
self.sendmsg.emit('第一參數(shù)','第二個參數(shù)')
第五步:將信號綁定到槽對象中的槽函數(shù)上,所以槽函數(shù)能收到所發(fā)射的信號,自此,數(shù)據(jù)傳遞成功,就是這么簡單,如果需要傳遞多個數(shù)據(jù),可以自定義參數(shù)類型與數(shù)目
send=QTypeSignal()
slot=QTypeSlot()
#
print('_____-把信號綁定到槽函數(shù)上_____')
send.sendmsg.connect(slot.get)
三:使用裝飾器信號與槽
1、使用格式
@PyQt5.QtCore.pyqtSlot(參數(shù)) def on_發(fā)送者對象名稱_發(fā)射信號名稱(self,參數(shù)): pass
2、注意點,使用裝飾器必須定義兩個東西
QMetaObject.connectSlotsByName(self)
給需要綁定事件的定義一個id(self.btn.setObjectName('名稱'))
3、按鈕的普通事件
...
class Window(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setWindowTitle('裝飾器信號與槽')
self.resize(500, 500)
self.move(400, 200)
self.btn = QPushButton('按鈕', self)
self.init_ui()
def init_ui(self):
self.btn.clicked.connect(self.btn_hand)
@staticmethod
def btn_hand():
print('使用connect點擊了按鈕')
...
4、使用裝飾器后的事件
...
class Window(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setWindowTitle('裝飾器信號與槽')
self.resize(500, 500)
self.move(400, 200)
self.btn = QPushButton('按鈕', self)
self.init_ui()
# 要在加載組件后使用
QMetaObject.connectSlotsByName(self)
def init_ui(self):
# 這個地方定義的名字直接在下面使用
self.btn.setObjectName('btn')
@pyqtSlot()
def on_btn_clicked(self):
print('使用裝飾器點擊了按鈕')
本文主要講解了PyQt5信號與槽基礎使用方法與實例,更多關于PyQt5信號與槽的知識請查看下面的相關鏈接
相關文章
Python Django 數(shù)據(jù)庫的相關操作詳解
下面小編就為大家?guī)硪黄猟jango數(shù)據(jù)庫的相關操作,小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2021-11-11
pandas 數(shù)據(jù)類型轉(zhuǎn)換的實現(xiàn)
這篇文章主要介紹了pandas 數(shù)據(jù)類型轉(zhuǎn)換的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12
pandas如何優(yōu)雅的列轉(zhuǎn)行及行轉(zhuǎn)列詳解
我們在做數(shù)據(jù)處理的時候遇到pandas列轉(zhuǎn)行的問題,這篇文章主要給大家介紹了關于pandas如何優(yōu)雅的列轉(zhuǎn)行及行轉(zhuǎn)列的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2021-12-12
PyTorch CUDA環(huán)境配置及安裝的步驟(圖文教程)
這篇文章主要介紹了PyTorch CUDA環(huán)境配置及安裝的步驟(圖文教程),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-04-04
提升Python Scrapy庫數(shù)據(jù)采集速度實現(xiàn)高效爬蟲
Scrapy是一個強大而靈活的Python爬蟲框架,被廣泛用于數(shù)據(jù)采集、網(wǎng)站抓取和網(wǎng)絡爬蟲開發(fā),本文將深入介紹Scrapy的功能和用法,并提供豐富的示例代碼,幫助更好地理解和應用2023-11-11
python pip配置國內(nèi)鏡像源的方法(永久和臨時)
在使用 pip 安裝 Python 模塊時,默認的國外鏡像源可能會導致下載速度緩慢甚至超時,為了解決這個問題,可以使用國內(nèi)的鏡像源來加速下載,以下是常用的國內(nèi)鏡像源以及臨時和永久的配置方法,需要的朋友可以參考下2025-04-04

