3.5 装饰器信号与槽+装饰器实现信号和槽的连接

一、装饰器信号与槽

1.基本概念

  • 通过装饰器的方法来定义信号和槽函数
  • 具体使用方法:
    这种方法的使用的前提是QMetaObject.connectSlotsByName(QObject)已经执行
@PyQt5.QtCore.pyqtSlot(参数) 
def on_发送者对象名称(就是)_发射信号名称(self,参数): 
   pass
  • 自动识别
    多加一行代码:
# #自动识别 多加下面一行
   self.okButton.clicked.connect(self.okButton_clicked)

#槽定义上名称发生改变,并且去除解释器
 def okButton_clicked(self) :
       print("点击了OK按钮")

2.代码

点击查看代码
# -*- coding: utf-8 -*-

"""
    【简介】
    信号和槽的自动连接例子


"""

from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QPushButton
import sys


class CustWidget(QWidget) :

    def __init__(self, parent=None) :
        super(CustWidget, self).__init__(parent)

        self.okButton = QPushButton("OK", self)
        # 使用setObjectName设置对象名称
        self.okButton.setObjectName("okButton")
        layout = QHBoxLayout()
        layout.addWidget(self.okButton)
        self.setLayout(layout)
        QtCore.QMetaObject.connectSlotsByName(self)
        # #自动识别 多加下面一行
        # self.okButton.clicked.connect(self.okButton_clicked)
   
    #解释器
    @QtCore.pyqtSlot()
    def on_okButton_clicked(self) :
        print("点击了OK按钮")

    # #自动识别
    # def okButton_clicked(self) :
    #     print("点击了OK按钮")

if __name__ == "__main__" :
    app = QApplication(sys.argv)
    win = CustWidget()
    win.show()
    sys.exit(app.exec_())

3.运行结果

二、装饰器实现信号和槽的连接

  • 使用装饰器来实现信号和槽之间的连接是一种技巧操作,对于特殊的开发环境和我们后期要学习到的Qt Designer有一定的帮助
  • 在所有子控件下方加这条代码:
QMetaObject.connectSlotsByName(self)
  • 注意命名规则
def on_btn1_clicked(self) :  # 注意命名规则 btn1就是第一个按钮

1.代码

点击查看代码
from PyQt5.Qt import *
import sys


class Window(QWidget) :
    def __init__(self) :
        super().__init__()
        self.setWindowTitle("信号和槽")
        self.resize(600, 500)
        self.func_list()

    def func_list(self) :
        self.func()
        self.on_btn1_clicked()

    def func(self) :
        btn = QPushButton('按钮', self)
        btn.setObjectName('btn1')
        btn.resize(80, 50)
        btn.move(100, 100)

        btn2 = QPushButton('按钮', self)
        btn2.setObjectName('btn2')
        btn2.resize(80, 50)
        btn2.move(100, 200)

        # 表示把window对象中的子对象按照objectName链接到相关的槽函数上,必须放在所有子控件的最后
        # 按照名称连接槽
        QMetaObject.connectSlotsByName(self)

    #解释器+槽函数
    @pyqtSlot(bool)  # 这里bool表示按钮有没有被选中
    def on_btn1_clicked(self) :  # 注意命名规则 btn1就是第一个按钮
        print('点击按钮')


if __name__ == '__main__' :
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

2.运行效果

posted @ 2022-03-23 12:00  Trouvaille_fighting  阅读(140)  评论(0)    收藏  举报