生活随笔
收集整理的這篇文章主要介紹了
PyQt5 笔记7 -- 多个类共享信号
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
PyQt5 筆記7 – 多個類共享信號
應用:對話框發送信號給主窗口,控制主窗口的控件
1、信號傳遞
- 主窗口類中自定義信號并在構造函數中綁定槽函數
- 實例化對話框類時把主窗口的對象傳過去
- 對話框中自定義信號并在構造函數中綁定槽函數為主窗口類中的信號觸發函數
- 當要執行主窗口類中自定義信號綁定槽函數時,只要觸發當前類中的自定義信號,就可以往上傳遞信號了
- 可以嵌套多層
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog, QPushButton
from PyQt5.QtCore import Qt, pyqtSignalclass MainWindow(QMainWindow):"""主窗口類"""my_signal = pyqtSignal()def __init__(self, *args):super(MainWindow, self).__init__(*args)# 設置主窗口的標題及大小self.setWindowTitle('主窗口')self.resize(400, 300)# 創建按鈕self.btn = QPushButton(self)self.btn.setText('彈出對話框')self.btn.clicked.connect(self.show_dialog)# 自定義信號綁定self.my_signal.connect(self.test)# 創建對話框對象self.dialog = Dialog(self)def show_dialog(self):self.dialog.show()self.dialog.exec()def test(self):self.btn.setText('我改變了')class Dialog(QDialog):"""對話框類"""my_signal = pyqtSignal()def __init__(self, parent, *args):super(Dialog, self).__init__(*args)# 設置對話框的標題及大小self.setWindowTitle('對話框')self.resize(200, 200)self.setWindowModality(Qt.ApplicationModal)self.btn = QPushButton(self)self.btn.setText('改變主窗口按鈕的名稱')self.btn.clicked.connect(self.my_signal.emit)# 自定義信號綁定self.my_signal.connect(parent.my_signal.emit)if __name__ == '__main__':app = QApplication(sys.argv)demo = MainWindow()demo.show()sys.exit(app.exec())
2、單例模式
- 新建一個信號類成單例模式(該類只能有一個對象),類中自定義信號和一個觸發信號的方法
- 在主窗口類中獲得信號類的對象的自定義信號,并綁定槽函數
- 在對話框類中調用信號類對象中的觸發信號的方法即可觸發信號
- 可以有多個對話框類共用信號類的觸發信號方法
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog, QPushButton
from PyQt5.QtCore import QObject, Qt, pyqtSignalclass MySignal(QObject):"""信號類"""instance = Nonesignal = pyqtSignal()@classmethoddef my_signal(cls):if cls.instance:return cls.instanceelse:obj = cls()cls.instance = objreturn cls.instancedef em(self):self.signal.emit()class MainWindow(QMainWindow):"""主窗口類"""Signal = MySignal.my_signal().signaldef __init__(self, *args):super(MainWindow, self).__init__(*args)# 設置主窗口的標題及大小self.setWindowTitle('主窗口')self.resize(400, 300)# 創建按鈕self.btn = QPushButton(self)self.btn.setText('彈出對話框')self.btn.move(50, 50)self.btn.clicked.connect(self.show_dialog)# 自定義信號綁定self.Signal.connect(self.test)self.dialog = Dialog()def show_dialog(self):self.dialog.show()self.dialog.exec()def test(self):self.btn.setText('我改變了')class Dialog(QDialog):"""對話框類"""def __init__(self, *args):super(Dialog, self).__init__(*args)# 設置對話框的標題及大小self.setWindowTitle('對話框')self.resize(200, 200)self.setWindowModality(Qt.ApplicationModal)self.btn = QPushButton(self)self.btn.setText('改變主窗口按鈕的名稱')self.btn.move(50, 50)self.btn.clicked.connect(MySignal.my_signal().em)if __name__ == '__main__':app = QApplication(sys.argv)demo = MainWindow()demo.show()sys.exit(app.exec())
總結
以上是生活随笔為你收集整理的PyQt5 笔记7 -- 多个类共享信号的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。