095.PyQt5_补充_自定义信号

  

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈
虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈
PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈
Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈
优 质 资 源 下 载 :👉👉 资源下载合集 👈👈

自定义信号

  • 当系统内部提供的控件类别的信号不足以满足开发需求时,我们就可以选择继承自该类(子类化该类),在自定义类里面扩充一些自定义信号
  • 例如:我们的按钮控件在鼠标右键单击的时候需要在界面输出“按钮被鼠标右键单击了”
  • 但是我们的系统并没有右键单击信号,此时我们就需要自己手动写一个右键单击的自定义信号
  • 自定义信号必须是在子类中重写方法

  • 信号的定义和发射
    • 定义信号:在类的内部,以类属性的形式定义一个信号
      # 通过pyqtSignal函数定义一个信号
      signal_name = pyqtSignal(类型1, 类型2...)
      
      # 重载版本
      signal_name = pyqtSignal([int], [str])
      
    • 发射信号:在事件机制中通过emit()方法发射信号
      signal_name.emit(参数1,参数2...)
      
    • 我们稍微了解一下类属性和实例属性(对象属性)
      from PyQt5.Qt import *
      
      
      class MyBtn1(QPushButton):
          name = 'FengZi'     # 类属性
      
      
      class MyBtn2(QPushButton):
          def func(self):
              age = 36        # 实例属性(对象属性)
              print(age)
      
  • 事件机制 / 信号与槽机制
  • 按钮添加右键自定义信号示例演示
    from PyQt5.Qt import *
    import sys
    
    
    class MyBtn(QPushButton):
        # 通过pyqtSignal方法定义一个信号rightClicked
        rightClicked = pyqtSignal()
    
        # 重写鼠标点击事件机制
        def mousePressEvent(self, evt) -> None:
            # 执行父类的鼠标点击事件机制,以免覆盖掉父类本身与鼠标点击相关的信号与槽机制
            super(MyBtn, self).mousePressEvent(evt)
    
            # evt.button()  # 通过事件对象获取到被按下的按钮
            # 判断事件对象被按下的按钮是否是右键
            if evt.button() == Qt.RightButton:
                # print('此时需要发射右键点击信号')
                # 发射信号
                self.rightClicked.emit()
    
    
    class Windows(QWidget):
        def __init__(self):
            super().__init__()
            self.setWindowTitle('自定义信号学习')
            self.resize(500, 300)
            self.widget_list()
    
        def widget_list(self):
            self.add_widget()
    
        def add_widget(self):
            btn = MyBtn('测试按钮', self)
            btn.resize(100, 50)
            btn.move(100, 100)
    
            btn.rightClicked.connect(self.btn_rightclick)
            btn.clicked.connect(self.btn_click)
    
        def btn_rightclick(self):
            print('鼠标【右键】按下了按钮')
    
        def btn_click(self):
            print('鼠标【左键】按下了按钮')
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        window = Windows()
    
        window.show()
        sys.exit(app.exec_())
    
    
  • 在QtDesigner中使用自定义信号
    • 1、首先我们创建一个py文件(rightclick_btn.py)
      from PyQt5.Qt import *
      
      
      class MyBtn(QPushButton):
          # 通过pyqtSignal方法定义一个信号rightClicked
          rightClicked = pyqtSignal()
      
          # 重写鼠标点击事件机制
          def mousePressEvent(self, evt) -> None:
              # 执行父类的鼠标点击事件机制,以免覆盖掉父类本身与鼠标点击相关的信号与槽机制
              super(MyBtn, self).mousePressEvent(evt)
      
              # evt.button()  # 通过事件对象获取到被按下的按钮
              # 判断事件对象被按下的按钮是否是右键
              if evt.button() == Qt.RightButton:
                  # print('此时需要发射右键点击信号')
                  # 发射信号
                  self.rightClicked.emit()
      
    • 2、进入QtDesigner工具,创建窗体,并添加一个QPushibutton控件(与我们刚刚自定义类的父类类型一致)
    • 3、在QPushibutton控件上鼠标右键 ——— 提升为...
    • 4、给这个按钮添加信号与槽:切换到信号与槽编辑模式,这里并没有看到我们自定义的信号,需要手动添加
    • 5、手动添加信号,点击底下的 Edit(编辑),在Signer(信号)栏添加信号
    • 6、选择信号之后,添加槽函数
    • 7、此时ui界面设计完成,保存ui文件后,转换成py文件,再通过新建py文件加载测试
      from PyQt5.Qt import *
      import sys
      from test_rightclick import Ui_Form
      
      
      class Windows(QWidget, Ui_Form):
          def __init__(self):
              super().__init__()
              self.setWindowTitle('右键按钮ui加载测试')
              self.resize(500, 300)
              self.widget_list()
      
          def widget_list(self):
              self.add_widget()
      
          def add_widget(self):
              self.setupUi(self)
      
          def btn_click(self):
              print('鼠标右键按下了按钮')
              
      
      if __name__ == '__main__':
          app = QApplication(sys.argv)
          window = Windows()
      
          window.show()
          sys.exit(app.exec_())
      
      
  • 用法进阶
    • 其实这里的4、5、6步可以不操作,在py文件加载之后再写信号与槽
    • 需要将刚刚ui界面中添加的信号与槽删除掉
      from PyQt5.Qt import *
      import sys
      from test_rightclick import Ui_Form
      
      
      class Windows(QWidget, Ui_Form):
          def __init__(self):
              super().__init__()
              self.setWindowTitle('右键按钮ui加载测试')
              self.resize(500, 300)
              self.widget_list()
      
          def widget_list(self):
              self.add_widget()
      
          def add_widget(self):
              self.setupUi(self)
              self.pushButton.rightClicked.connect(self.btn_click)
      
      
          def btn_click(self):
              print('鼠标右键按下了按钮')
      
      
      if __name__ == '__main__':
          app = QApplication(sys.argv)
          window = Windows()
      
          window.show()
          sys.exit(app.exec_())
      
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

失心疯_2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值