您好,登錄后才能下訂單哦!
一、介紹
信號(hào)(Signal)和槽(Slot)是Qt中的核心機(jī)制,也是PyQt變成中對(duì)象之間進(jìn)行通信的機(jī)制
在pyqt5中,每一個(gè)QObject對(duì)象和pyqt中所有繼承自QWidget的控件都支持信號(hào)和槽
當(dāng)信號(hào)發(fā)射時(shí),連接槽函數(shù)將會(huì)自動(dòng)執(zhí)行,pyqt5中信號(hào)與槽通過(guò)connect()函數(shù)連接起來(lái)的。
在pyqt5中信號(hào)主要分兩類:
1.內(nèi)置信號(hào)(詳細(xì)參考各個(gè)組件)
2.自定義信號(hào)(主要用于組件之間數(shù)據(jù)的傳遞與窗口交互)
二、內(nèi)置信號(hào)的簡(jiǎn)單介紹
使用connect()方法將信號(hào)與槽函數(shù)綁定在一起,使用disconnect()函數(shù)將信號(hào)與槽解除綁定
1、按鈕點(diǎn)擊事件(舉例)
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('按鈕點(diǎn)擊了') if __name__ == "__main__": app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
2、如果連接的事件要傳遞參數(shù)直接使用lambda函數(shù)
... 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('按鈕點(diǎn)擊了:{}'.format(flag)) ...
三、自定義信號(hào)
1、最基本無(wú)參數(shù)的信號(hào)與槽
import sys from PyQt5.Qt import * class SignalObj(QObject): """ 定義一個(gè)信號(hào)的類 """ # 自定義一個(gè)信號(hào) 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() # 將事件與槽建立關(guān)聯(lián) self.send.sendMsg.connect(self.slot_hand) self.init_ui() def init_ui(self): # 系統(tǒng)中自帶的事件與槽函數(shù)建立連接 self.btn.clicked.connect(self.btn_hand) def btn_hand(self): self.send.run() @staticmethod def slot_hand(): print('我是自定義的槽函數(shù)') if __name__ == "__main__": app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
2、信號(hào)中發(fā)射出數(shù)據(jù)
import sys from PyQt5.Qt import * class SignalObj(QObject): """ 定義一個(gè)信號(hào)的類 """ # 自定義一個(gè)信號(hào),注意這個(gè)地方定義約束發(fā)送出去的參數(shù)類型,下面要一致 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() # 將事件與槽建立關(guān)聯(lián) self.send.sendMsg.connect(self.slot_hand) self.init_ui() def init_ui(self): # 系統(tǒng)中自帶的事件與槽函數(shù)建立連接 self.btn.clicked.connect(self.btn_hand) def btn_hand(self): self.send.run() @staticmethod def slot_hand(msg): print(f'我是自定義的槽函數(shù):{msg}') if __name__ == "__main__": app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
3、對(duì)于發(fā)送多種不同數(shù)據(jù)類型的事件
import sys from PyQt5.Qt import * class SignalObj(QObject): """ 定義一個(gè)信號(hào)的類 """ # 自定義一個(gè)信號(hào),注意這個(gè)地方定義約束發(fā)送出去的參數(shù)類型,下面要一致 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() # 將事件與槽建立關(guān)聯(lián)(這個(gè)地方你要接收那個(gè)數(shù)據(jù)類型的事件) self.send.sendMsg[int].connect(self.slot_hand) self.init_ui() def init_ui(self): # 系統(tǒng)中自帶的事件與槽函數(shù)建立連接 self.btn.clicked.connect(self.btn_hand) def btn_hand(self): self.send.run() @staticmethod def slot_hand(msg): print(f'我是自定義的槽函數(shù):{msg}') if __name__ == "__main__": app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
四、使用裝飾器信號(hào)與槽
1、使用格式
@PyQt5.QtCore.pyqtSlot(參數(shù)) def on_發(fā)送者對(duì)象名稱_發(fā)射信號(hào)名稱(self,參數(shù)): pass
2、注意點(diǎn),使用裝飾器必須定義兩個(gè)東西
QMetaObject.connectSlotsByName(self)
給需要綁定事件的定義一個(gè)id(self.btn.setObjectName('名稱'))
3、按鈕的普通事件
... class Window(QWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle('裝飾器信號(hào)與槽') 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點(diǎn)擊了按鈕') ...
4、使用裝飾器后的事件
... class Window(QWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle('裝飾器信號(hào)與槽') self.resize(500, 500) self.move(400, 200) self.btn = QPushButton('按鈕', self) self.init_ui() # 要在加載組件后使用 QMetaObject.connectSlotsByName(self) def init_ui(self): # 這個(gè)地方定義的名字直接在下面使用 self.btn.setObjectName('btn') @pyqtSlot() def on_btn_clicked(self): print('使用裝飾器點(diǎn)擊了按鈕') ...
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。