pyqt5中信号与槽的认识
生活随笔
收集整理的這篇文章主要介紹了
pyqt5中信号与槽的认识
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、介紹
信號(Signal)和槽(Slot)是Qt中的核心機制,也是PyQt變成中對象之間進行通信的機制
在pyqt5中,每一個QObject對象和pyqt中所有繼承自QWidget的控件都支持信號和槽
當信號發射時,連接槽函數將會自動執行,pyqt5中信號與槽通過connect()函數連接起來的。
在pyqt5中信號主要分兩類:
- 1.內置信號(詳細參考各個組件)
- 2.自定義信號(主要用于組件之間數據的傳遞與窗口交互)
二、內置信號的簡單介紹
使用connect()方法將信號與槽函數綁定在一起,使用disconnect()函數將信號與槽解除綁定
-
1、按鈕點擊事件(舉例)
import sys from PyQt5.Qt import *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.resize(100, 30)self.btn.move(100, 50)self.btn.clicked.connect(self.btn_hand)def btn_hand(self):print('按鈕點擊了')if __name__ == "__main__":app = QApplication(sys.argv)window = Window()window.show()sys.exit(app.exec_()) 復制代碼 -
2、如果連接的事件要傳遞參數直接使用lambda函數
... def init_ui(self):self.btn.resize(100, 30)self.btn.move(100, 50)self.btn.clicked.connect(lambda: self.btn_hand(1))def btn_hand(self, flag):print('按鈕點擊了:{}'.format(flag)) ... 復制代碼
三、自定義信號
-
1、最基本無參數的信號與槽
import sys from PyQt5.Qt import *class SignalObj(QObject):"""定義一個信號的類"""# 自定義一個信號sendMsg = pyqtSignal()def __init__(self):super().__init__()def run(self):self.sendMsg.emit()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.send = SignalObj()# 將事件與槽建立關聯self.send.sendMsg.connect(self.slot_hand)self.init_ui()def init_ui(self):# 系統中自帶的事件與槽函數建立連接self.btn.clicked.connect(self.btn_hand)def btn_hand(self):self.send.run()def slot_hand():print('我是自定義的槽函數')if __name__ == "__main__":app = QApplication(sys.argv)window = Window()window.show()sys.exit(app.exec_()) 復制代碼 -
2、信號中發射出數據
import sys from PyQt5.Qt import *class SignalObj(QObject):"""定義一個信號的類"""# 自定義一個信號,注意這個地方定義約束發送出去的參數類型,下面要一致sendMsg = pyqtSignal(str)def __init__(self):super().__init__()def run(self):self.sendMsg.emit('hello')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.send = SignalObj()# 將事件與槽建立關聯self.send.sendMsg.connect(self.slot_hand)self.init_ui()def init_ui(self):# 系統中自帶的事件與槽函數建立連接self.btn.clicked.connect(self.btn_hand)def btn_hand(self):self.send.run()def slot_hand(msg):print(f'我是自定義的槽函數:{msg}')if __name__ == "__main__":app = QApplication(sys.argv)window = Window()window.show()sys.exit(app.exec_()) 復制代碼 -
3、對于發送多種不同數據類型的事件
import sys from PyQt5.Qt import *class SignalObj(QObject):"""定義一個信號的類"""# 自定義一個信號,注意這個地方定義約束發送出去的參數類型,下面要一致sendMsg = pyqtSignal([str], [int])def __init__(self):super().__init__()def run(self):self.sendMsg[str].emit('hello')self.sendMsg[int].emit(999)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.send = SignalObj()# 將事件與槽建立關聯(這個地方你要接收那個數據類型的事件)self.send.sendMsg[int].connect(self.slot_hand)self.init_ui()def init_ui(self):# 系統中自帶的事件與槽函數建立連接self.btn.clicked.connect(self.btn_hand)def btn_hand(self):self.send.run()def slot_hand(msg):print(f'我是自定義的槽函數:{msg}')if __name__ == "__main__":app = QApplication(sys.argv)window = Window()window.show()sys.exit(app.exec_()) 復制代碼
四、使用裝飾器信號與槽
-
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)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')def on_btn_clicked(self):print('使用裝飾器點擊了按鈕') ... 復制代碼
總結
以上是生活随笔為你收集整理的pyqt5中信号与槽的认识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAPGUI系统登录页面配置的SAPro
- 下一篇: 我的2018