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)
      
    • 095.PyQt5_补充_自定义信号_第1张图片

  • 事件机制 / 信号与槽机制
    • 事件机制更偏底层
    • 信号与槽机制是对事件机制的高级封装
    • 有些控件并没有提供给我们想要的信号, 我们就需要自己重写具体的事件函数, 来捕获产生的事件
    • QObject基类_信号与槽函数
    • QObject基类_事件机制
    • 095.PyQt5_补充_自定义信号_第2张图片

  • 按钮添加右键自定义信号示例演示
    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控件上鼠标右键 ——— 提升为...
      • 095.PyQt5_补充_自定义信号_第3张图片

      • 095.PyQt5_补充_自定义信号_第4张图片

    • 4、给这个按钮添加信号与槽:切换到信号与槽编辑模式,这里并没有看到我们自定义的信号,需要手动添加
      • 095.PyQt5_补充_自定义信号_第5张图片

    • 5、手动添加信号,点击底下的 Edit(编辑),在Signer(信号)栏添加信号
      • 095.PyQt5_补充_自定义信号_第6张图片

    • 6、选择信号之后,添加槽函数
      • 095.PyQt5_补充_自定义信号_第7张图片

    • 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_())
      

你可能感兴趣的:(PyQt5,pyqt5,python,gui,python,pyqt,qt)