一、介紹
信號(Signal)和槽(Slot)是Qt中的核心機制,也是PyQt變成中對象之間進行通信的機制
在pyqt5中,每一個QObject對象和pyqt中所有繼承自QWidget的控件都支持信號和槽
當信號發射時,連接槽函數將會自動執行,pyqt5中信號與槽通過connect()函數連接起來的。
在pyqt5中信號主要分兩類:
1.內置信號(詳細參考各個組件)
2.自定義信號(主要用于組件之間數據的傳遞與窗口交互)
二、內置信號的簡單介紹
使用connect()方法將信號與槽函數綁定在一起,使用disconnect()函數將信號與槽解除綁定
1、按鈕點擊事件(舉例)
import sysfrom 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 sysfrom 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() @staticmethod def slot_hand(): print('我是自定義的槽函數')if __name__ == "__main__": app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())2、信號中發射出數據
import sysfrom 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() @staticmethod def slot_hand(msg): print(f'我是自定義的槽函數:{msg}')if __name__ == "__main__": app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
新聞熱點
疑難解答