pyqt 槽任意参数_PyQt5信号与槽机制入门(一)
信號(Signal)與槽(Slot)是Qt中的核心機制,也是在PyQt編程中對象之間進行通信的機制。當事件或者狀態(tài)發(fā)生改變時,就會發(fā)出信號,信號會觸發(fā)所有與這個事件(信號)相關(guān)的函數(shù)(槽);一個信號可以連接多個槽,一個槽也也可監(jiān)聽多個信號。關(guān)于PyQtAPI中信號與槽的更多詳細解釋,可以參考官方網(wǎng)站:https://www.riverbankcomputing.com/static/Docs/PyQt5/signals_slots.html?hightlight=pyqtsignal#P與Qt.QtCore.pyqtSignal
1、內(nèi)置信號與槽的使用
指在發(fā)射信號時,使用窗口控件的函數(shù),而不是自定義的函數(shù)。本例將一個按鈕對象內(nèi)置clicked信號連接到自定義的槽函數(shù)cao(),點擊“點擊我測試”按鈕,就會彈出一個信息提示框。
#0、導(dǎo)入需要的包和模塊from?PyQt5.Qt?import?*
import?sys
#1、創(chuàng)建一個應(yīng)用程序?qū)ο蟆?br />app=QApplication(sys.argv)
#2、控件的操作
#創(chuàng)建控件
window=QWidget()
btn?=?QPushButton(window)
btn.setText("點擊我測試")
def?cao():
????QMessageBox.information(window,"信息提示框","點我干嘛")
btn.clicked.connect(cao)
#設(shè)置控件(大小、位置、樣式...)
window.setWindowTitle("Python數(shù)據(jù)分析實例")
window.resize(300,300)
window.move(400,200)
#展示控件
window.show()
#3、應(yīng)用程序的執(zhí)行,進入到消息循環(huán)
sys.exit(app.exec_())
2、自定義信號與槽的使用
指在發(fā)射信號時,不使用窗口控件的函數(shù),而是利用自定義的函數(shù),即使用pyqtSignal類實例發(fā)射的信號。內(nèi)置函數(shù)只包含常用的信號,有些信號找不到對應(yīng)的內(nèi)置函數(shù),只有特定情況下如按鈕事件才能發(fā)射這種信號,其次,傳遞的參數(shù)是特定的,因此,使用自定義信號更靈活地實現(xiàn)實際業(yè)務(wù)邏輯,比如在程序中某個地方需要發(fā)射一個信號,傳遞多種數(shù)據(jù)類型(參數(shù)),然后在槽函數(shù)中接受傳遞過來的數(shù)據(jù)。
使用PyQt5.QtCore.pyqSignal()函數(shù)可以為QObject創(chuàng)建一個信號,使用pyqtSignal()函數(shù)可以把信號定義為類的屬性。信號必須在類創(chuàng)建時定義,不能再類創(chuàng)建后作為類的屬性動態(tài)的添加。
classFoo(QObject):# This will cause problems because each has the same C++ signature.valueChanged=pyqtSignal([dict],[list])#為控件創(chuàng)建信號
#傳遞一個參數(shù)from?PyQt5.QtCore?import??QObject,pyqtSignal
#信號對象
class?QTypeSignal(QObject):
????#生成一個信號
????sendmsg=pyqtSignal(str)
????def?__init__(self):
????????super(QTypeSignal,?self).__init__()
????def?run(self):
????????#發(fā)射信號
????????self.sendmsg.emit("Python數(shù)據(jù)分析實例")
????#槽對象
class?QTypeSlot(QObject):
????def?__init__(self):
????????super(QTypeSlot,?self).__init__()
????#槽對象中的槽函數(shù)
????def?get(self,msg):
????????print("QSlot?get?msg=>"+msg)
if?__name__?=="__main__":
????#?把信號綁定到槽對象中的槽函數(shù)get()上,槽函數(shù)能接受到所發(fā)射的信號”Python數(shù)據(jù)分析實例“,數(shù)據(jù)成功傳遞。
????send?=QTypeSignal()
????slot?=QTypeSlot()
????#**************將信號與槽函數(shù)綁定起來**************開始
????send.sendmsg.connect(slot.get)
????send.run()
????#************將信號與槽函數(shù)綁定起來****************結(jié)束
????#*************把信號與槽函數(shù)連接斷開***************開始
????send.sendmsg.disconnect(slot.get)
????send.run()
????#*************把信號與槽函數(shù)連接斷開***************結(jié)束
#傳遞兩個或多個參數(shù),同理
from?PyQt5.QtCore?import?QObject,?pyqtSignal
#?信號對象
class?QTypeSignal(QObject):
????#?生成一個信號
????sendmsg?=?pyqtSignal(str,str)
????def?__init__(self):
????????super(QTypeSignal,?self).__init__()
????def?run(self):
????????#?發(fā)射信號(兩個參數(shù))
????????self.sendmsg.emit("Python數(shù)據(jù)分析實例","Brook")
#?槽對象
class?QTypeSlot(QObject):
????def?__init__(self):
????????super(QTypeSlot,?self).__init__()
????#?槽對象中的槽函數(shù)
????def?get(self,?msg1,msg2):
????????print("QSlot?get?msg=>"?+?msg1+'?'+?msg2)
if?__name__?==?"__main__":
????#?把信號綁定到槽對象中的槽函數(shù)get()上,槽函數(shù)能接受到所發(fā)射的信號”Python數(shù)據(jù)分析實例“,數(shù)據(jù)成功傳遞。
????send?=?QTypeSignal()
????slot?=?QTypeSlot()
????#?**************將信號與槽函數(shù)綁定起來**************開始
????send.sendmsg.connect(slot.get)
????send.run()
????#?************將信號與槽函數(shù)綁定起來****************結(jié)束
????#?*************把信號與槽函數(shù)連接斷開***************開始
????send.sendmsg.disconnect(slot.get)
????send.run()
????#?*************把信號與槽函數(shù)連接斷開***************結(jié)束
其他信號與槽高級用法,后續(xù)詳細介紹。
總結(jié)
以上是生活随笔為你收集整理的pyqt 槽任意参数_PyQt5信号与槽机制入门(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全民k歌礼物墙是不是礼物榜
- 下一篇: typescript get方法_使用