日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pyqt5中信号与槽的认识

發布時間:2025/6/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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() @staticmethoddef 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() @staticmethoddef 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() @staticmethoddef 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) @staticmethoddef 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中信号与槽的认识的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。