• 信号与槽-高级应用


    1. 高级自定义信号与槽

    自定义信号的一般流程:

      1)定义信号

      2)定义槽函数

      3)连接信号与槽函数

      4)发射信号

    实例
    import sys
    from PyQt5.QtCore import pyqtSignal, QObject
    
    
    class CustSignal(QObject):
        # 声明无参数的信号
        signal1 = pyqtSignal()
    
        # 声明带一个int类型参数的信号
        signal2 = pyqtSignal(int)
    
        # 声明带int和str类型参数的信号
        signal3 = pyqtSignal(int, str)
    
        # 声明带一个列表类型参数的信号
        signal4 = pyqtSignal(list)
    
        # 声明带一个字典类型参数的信号
        signal5 = pyqtSignal(dict)
    
        # 声明带一个多重载版本的信号,包括带int和str类型参数的信号和带str类型参数的信号
        signal6 = pyqtSignal([int, str], [str])
    
        def __init__(self, parent=None):
            super().__init__(parent)
    
            # 将信号连接到指定槽函数
            self.signal1.connect(self.signalCall1)
            self.signal2.connect(self.signalCall2)
            self.signal3.connect(self.signalCall3)
            self.signal4.connect(self.signalCall4)
            self.signal5.connect(self.signalCall5)
            self.signal6[int, str].connect(self.signalCall6)
            self.signal6[str].connect(self.signalCall6OverLoad)
    
            # 发射信号
            self.signal1.emit()
            self.signal2.emit(1)
            self.signal3.emit(1, "text")
            self.signal4.emit([1, 2, 3, 4])
            self.signal5.emit({"name": "wangwu", "age": 14})
            self.signal6[int, str].emit(1, "text")
            self.signal6[str].emit("text")
    
        def signalCall1(self):
            print("signal1 emit")
    
        def signalCall2(self, val):
            print("signal2 emit, value:", val)
    
        def signalCall3(self, val, text):
            print("signal3 emit, value:", val, text)
    
        def signalCall4(self, val):
            print("signal4 emit, value:", val)
    
        def signalCall5(self, val):
            print("signal5 emit, value:", val)
    
        def signalCall6(self, val, text):
            print("signal6 emit, value:", val, text)
    
        def signalCall6OverLoad(self, val):
            print("signal6 overload emit, value:", val)
    
    
    if __name__ == "__main__":
        custSignal = CustSignal()

    2. 使用自定义参数

    解决信号发出的参数个数小于槽函数接收的参数个数的两种方法,重点是自定义参数的传递:

      1. 使用 lambda 表达式。

    import sys
    from PyQt5.QtWidgets import QMainWindow, QWidget, QApplication, QPushButton, QMessageBox, QHBoxLayoutclass WinForm(QMainWindow):
        def __init__(self, parent=None):
            super().__init__(parent)
            btn1 = QPushButton("Button 1")
            btn2 = QPushButton("Button 2")
    
            btn1.clicked.connect(lambda: self.onButtonClick(1))
            btn2.clicked.connect(lambda: self.onButtonClick(2))
    
            layout = QHBoxLayout()
            layout.addWidget(btn1)
            layout.addWidget(btn2)
    
            main_form = QWidget()
            main_form.setLayout(layout)
            self.setCentralWidget(main_form)
    
        def onButtonClick(self, n):
            print("Button {0} 被按下了".format(n))
            QMessageBox.information(self, "信息提示框", "Button {0} clicked".format(n))
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        win = WinForm()
        win.show()
        sys.exit(app.exec_())

      2. 使用functools 中的 partial 函数。

    import sys
    from PyQt5.QtWidgets import QMainWindow, QWidget, QApplication, QPushButton, QMessageBox, QHBoxLayout
    from functools import partial
    
    
    class WinForm(QMainWindow):
        def __init__(self, parent=None):
            super().__init__(parent)
            btn1 = QPushButton("Button 1")
            btn2 = QPushButton("Button 2")
    
            btn1.clicked.connect(partial(self.onButtonClick, 1))
            btn2.clicked.connect(partial(self.onButtonClick, 2))
    
            layout = QHBoxLayout()
            layout.addWidget(btn1)
            layout.addWidget(btn2)
    
            main_form = QWidget()
            main_form.setLayout(layout)
            self.setCentralWidget(main_form)
    
        def onButtonClick(self, n):
            print("Button {0} 被按下了".format(n))
            QMessageBox.information(self, "信息提示框", "Button {0} clicked".format(n))
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        win = WinForm()
        win.show()
        sys.exit(app.exec_())
  • 相关阅读:
    前缀和与差分
    可行!解决bitmap缩放失真问题
    Android 中的 File renameTo() 使用
    XMPP 中客户端断线及网络异常处理
    webview 离线缓存,html5游戏适用
    Mac os x下配置 Android ndk 开发环境
    从外企到国企的工作环境改变
    微软SQL Server数据库SQL语句导入导出大全,包括与其他数据库和文件的数据的导入导出
    人生第一职业:我当了人民教师
    JOIN 分为内连接,外连接(左外连接,右外连接,全外连接)
  • 原文地址:https://www.cnblogs.com/lynsha/p/13471262.html
Copyright © 2020-2023  润新知