python GUI庫圖形界面開發之PyQt5信號與槽基礎使用方法與實例

 更新時間:2020-03-06 15:15:02   作者:佚名   我要評論(0)

信號與槽有三種使用方法
第一種:內置信號與槽的使用
第二種:自定義信號與槽的使用
第三種:裝飾器的信號與槽的使用
一: 內置信號與槽的使用
內置信號與槽的使用,

信號與槽有三種使用方法

第一種:內置信號與槽的使用

第二種:自定義信號與槽的使用

第三種:裝飾器的信號與槽的使用

一: 內置信號與槽的使用

內置信號與槽的使用,是指在發射信號時,使用窗口控件的函數,而不是自定義的函數,這種也是我們前面用的最多的,下面簡單的一個實例,大家就會明白

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_())

運行腳本,顯示效果如下

這個例子將一個按鈕對象的內置clicked信號與自定義槽函數showMsg()連接,單擊按鈕,就會觸發這個槽函數,彈出一個信息提示框

二:自定義信號與槽的使用

自定義信號與槽的使用,是指在發射信號時,不使用窗口控件的函數,而是使用自定義的函數,(簡單的說就是使用oyqtsSignal類實例發射信號),之所以要使用自定義的信號與槽,是因為通過內置函數發射信號有自身的缺陷,首先,內置函數只包含一些常用地信號,有些信號發射找不到對應的內置函數,其次在特定的情況下,才能發射此信號,如按鈕的點擊事件,最后,內置函數傳遞的參數是特定的,不可以自定義,使用自定義的信號與槽函數則沒有這些缺陷

在pyqt5中,自定義信號與槽的適用很靈活,比如因為業務需要,在程序中的某些地方需要發射一個信號,傳遞多種數據,然后在槽函數接受這些數據,這樣就可以很靈活的實現一些業務邏輯

簡單的一個實例:簡單的自定義信號與槽

from PyQt5.QtCore import QObject,pyqtSignal
#信號對象
class QTypeSignal(QObject):
 #定義一個信號
 # sendmsg = pyqtSignal(object)
 #todo 優化 多個參數傳遞
 sendmsg=pyqtSignal(str,str)
 def __init__(self):
 super(QTypeSignal, self).__init__()
 def run( self ):
 #發射信號
 #self.sendmsg.emit('hell')
 #todo 優化 發射多個參數
 self.sendmsg.emit('第一參數','第二個參數')
#槽對象
class QTypeSlot(QObject):
 def __init__(self):
 super(QTypeSlot, self).__init__()
 #槽對象中的槽函數
 # def get( self,msg ):
 # print("QSlot get msg => " + msg)
 #todo 優化 多個參數
 def get( self,msg1,msg2 ):
 print("QSlot get msg => " + msg1+' '+msg2)
if __name__ == '__main__':
 #實例化信號對象
 send=QTypeSignal()
 #實例化槽對象
 slot=QTypeSlot()
 #1
 print('_____-把信號綁定到槽函數上_____')
 send.sendmsg.connect(slot.get)
 send.run()
 print('_____-把信號與槽函數解綁_____')
 send.sendmsg.disconnect(slot.get)
 send.run()

信號與槽連接的主要步驟如下

第一步:生成一個信號

    #定義一個信號

    # sendmsg = pyqtSignal(object)

    #todo 優化 多個參數傳遞

    sendmsg=pyqtSignal(str,str)

第二步:將信號與槽函數連接起來

print('_____-把信號綁定到槽函數上_____')

    send.sendmsg.connect(slot.get)

第三步:槽函數接受數據

 def get( self,msg1,msg2 ):

        print("QSlot get msg => " + msg1+' '+msg2)

第四步:發射信號的實現

 self.sendmsg.emit('第一參數','第二個參數')

第五步:將信號綁定到槽對象中的槽函數上,所以槽函數能收到所發射的信號,自此,數據傳遞成功,就是這么簡單,如果需要傳遞多個數據,可以自定義參數類型與數目

    send=QTypeSignal()

    slot=QTypeSlot()

    #

    print('_____-把信號綁定到槽函數上_____')

    send.sendmsg.connect(slot.get)

三:使用裝飾器信號與槽

1、使用格式

@PyQt5.QtCore.pyqtSlot(參數)
def on_發送者對象名稱_發射信號名稱(self,參數):
 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 GUI庫圖形界面開發之PyQt5信號與槽的高級使用技巧(自定義信號與槽)詳解與實例
  • python GUI庫圖形界面開發之PyQt5信號與槽基本操作
  • python GUI庫圖形界面開發之PyQt5信號與槽機制、自定義信號基礎介紹
  • PyQt5通信機制 信號與槽詳解
  • 淺談pyqt5中信號與槽的認識
  • python GUI庫圖形界面開發之PyQt5信號與槽的高級使用技巧裝飾器信號與槽詳細使用方法與實例

相關文章

最新評論

老快3投注技巧 12月13号的股票分析 11选5走势图定牛辽宁 云南省十一选五开奖走势图 贵州快3和值 佳永配资 股票融资融券是怎么 期货配资济南 山东十一选五专家预测 湖北十一选五玩法 陕西体彩11选5手机版 中国太保股票行情 山西11选五前3走势图 北京快乐8是国家开的吗 国家福利彩票快乐8违法吗 上海十一选五开奖号 五分快三中奖计划官网