当前位置:   article > 正文

​pyqt5学习之自定义信号 ​_pyqt5 点击了其他控件信号

pyqt5 点击了其他控件信号

记录自定义信号创建和使用

1.信号的定义:在类内部,以类属性形式定义;pyqtSignal([int],[str])

                注意:一个信号连接另外一个信号时,必需保证参数类型和个数一致。

信号的定义需要掌握以下几点:

  1. 信号的声明:  信号名 = pyqtSignal(类型)

  2. 信号的触发:  信号名.emit(信号内容)

  3. 信号的接收:  信号所在类实例.信号名.connect(接收函数)

下文以一个右击按钮信号demo示例

需要自定义某个控件的信号,你需要创建一个新类继承原来的类

  1. from PyQt5.Qt import *
  2. # 自定义信号按键方法程序
  3. class Btn(QPushButton):
  4. rightClicked = pyqtSignal([str],[int, str])
  5. #设置自定义信号函数pyqtSignal在使用时默认传递一个参数,可以使用[int, str...]传递多个参数
  6. def mousePressEvent(self, evt):
  7. super(Btn, self).mousePressEvent(evt)
  8. #一定要使用super,因为程序先看子类方法再去看父类方法,子类方法覆盖了
  9. #父类方法,会到导致mousePressEvent()的其他方法无法使用
  10. #evt:事件对象
  11. if evt.button() == Qt.RightButton:
  12. print('应该发射右击信号')
  13. self.rightClicked[str].emit(self.text())
  14. #传递值,默认是pyqtSignal的第一个参数,可以加[str]确定传送目标值
  15. self.rightClicked[int, str].emit(888,'xuexi')
  16. # emit:确保自定义信号的发射,保证槽函数正确使用
  17. class Window(QWidget):
  18. def __init__(self):
  19. super(Window, self).__init__()
  20. self.setWindowTitle('自定义信号')
  21. self.resize(500,500)
  22. self.setup_ui()
  23. def setup_ui(self):
  24. btn = Btn('xx',self) # 继承自定信号类
  25. btn.rightClicked[int, str].connect(lambda content, c2:print("按钮右键被点击了", content, c2))
  26. btn.pressed.connect(lambda :print("按钮被按下"))
  27. if __name__ == '__main__':
  28. import sys
  29. app = QApplication(sys.argv)
  30. window = Window()
  31. window.show()
  32. sys.exit(app.exec_())

案例二:连接一个槽函数

  1. from PyQt5.Qt import *
  2. # 自定义信号按键方法程序
  3. class Btn(QPushButton):
  4. rightClicked = pyqtSignal() # 定义一个rightClicked信号
  5. # 设置自定义信号函数pyqtSignal在使用时默认传递一个参数,可以使用[int, str...]传递多个参数
  6. def mousePressEvent(self, evt):
  7. super(Btn, self).mousePressEvent(evt)
  8. # 一定要使用super,因为程序先看子类方法再去看父类方法,子类方法覆盖了
  9. # 父类方法,会到导致mousePressEvent()的其他方法无法使用
  10. # evt:事件对象
  11. if evt.button() == Qt.RightButton:
  12. print('应该发射右击信号')
  13. self.rightClicked.emit() # 触发信号
  14. class Window(QWidget):
  15. def __init__(self):
  16. super(Window, self).__init__()
  17. self.setWindowTitle('自定义信号')
  18. self.resize(500, 500)
  19. self.setup_ui()
  20. def cao(self):
  21. print('lianjie')
  22. def setup_ui(self):
  23. btn = Btn('xx', self) # 继承自定信号类
  24. btn.rightClicked.connect(self.cao) # 链接槽函数
  25. if __name__ == '__main__':
  26. import sys
  27. app = QApplication(sys.argv)
  28. window = Window()
  29. window.show()
  30. sys.exit(app.exec_())

2.利用装饰器自动连接信号与槽

核心函数:QMetaObject.connectSlotsByName(obj);@pyqtSlot()

  1. from PyQt5.Qt import *
  2. class Window(QWidget):
  3. def __init__(self):
  4. super(Window, self).__init__()
  5. self.setWindowTitle('装饰器连接信号与槽的学习')
  6. self.resize(500,500)
  7. self.setup_ui()
  8. def setup_ui(self):
  9. btn = QPushButton('测试按钮',self)
  10. btn.setObjectName('btn')
  11. btn.resize(200,200)
  12. btn.move(100,100)
  13. btn2 = QPushButton("测试按钮2", self)
  14. btn2.setObjectName("btn2")
  15. btn2.resize(200, 200)
  16. btn2.move(100, 300)
  17. QMetaObject.connectSlotsByName(self)
  18. # 注意QMetaObject.connectSlotsByName(obj)一定要放在槽函数控件设置后
  19. # 否则无法使用该方法
  20. @pyqtSlot() # 将@pyqtSlot()放置在槽函数上
  21. def on_btn_clicked(self):
  22. print('成功连接')
  23. # 槽函数格式为on_ObjectName(控件设置的setObjectName)_信号
  24. if __name__ == '__main__':
  25. import sys
  26. app = QApplication(sys.argv)
  27. window = Window()
  28. window.show()
  29. sys.exit(app.exec_())

自定义信号和装饰器连用

  1. from PyQt5.Qt import *
  2. class Btn(QPushButton):
  3. rightClicked = pyqtSignal()
  4. #设置自定义信号函数pyqtSignal在使用时默认传递一个参数,可以使用[int, str...]传递多个参数
  5. def mousePressEvent(self, evt):
  6. super(Btn, self).mousePressEvent(evt)
  7. #一定要使用super,因为程序先看子类方法再去看父类方法,子类方法覆盖了
  8. #父类方法,会到导致mousePressEvent()的其他方法无法使用
  9. #evt:事件对象
  10. if evt.button() == Qt.RightButton:
  11. print('应该发射右击信号')
  12. #传递值,默认是pyqtSignal的第一个参数,可以加[str]确定传送目标值
  13. self.rightClicked.emit()
  14. # emit:信号的发射
  15. class Window(QWidget):
  16. def __init__(self):
  17. super(Window, self).__init__()
  18. self.setWindowTitle('装饰器连接信号与槽的学习')
  19. self.resize(500,500)
  20. self.setup_ui()
  21. def setup_ui(self):
  22. btn = Btn('测试按钮',self)
  23. btn.setObjectName('btn')
  24. btn.resize(200,200)
  25. btn.move(100,100)
  26. btn2 = QPushButton("测试按钮2", self)
  27. btn2.setObjectName("btn2")
  28. btn2.resize(200, 200)
  29. btn2.move(100, 300)
  30. QMetaObject.connectSlotsByName(self)
  31. # 注意QMetaObject.connectSlotsByName(obj)一定要放在槽函数控件设置后
  32. # 否则无法使用该方法
  33. @pyqtSlot() # 将@pyqtSlot()放置在槽函数上
  34. def on_btn_rightClicked(self):
  35. print('成功连接')
  36. # 槽函数格式为on_ObjectName(控件设置的setObjectName)_信号
  37. if __name__ == '__main__':
  38. import sys
  39. app = QApplication(sys.argv)
  40. window = Window()
  41. window.show()
  42. sys.exit(app.exec_())

 上述是通过一个控件类增加自定义信号,下面讨论在一个类方法内使用方法

应用场景比如自动刷新数据

步骤分三步:1.创建信号: 信号名 = pyqtSignal(类型)

            2.建立信号和槽的连接: 信号所在类实例.信号名.connect(self.槽函数名)

            3.发射信号:信号名.emit()

  1. from PyQt5.Qt import *
  2. from PyQt5.QtCore import *
  3. import sys
  4. class Window(QWidget):
  5. signal = pyqtSignal() # 1.创建信号
  6. def __init__(self):
  7. super(Window, self).__init__()
  8. self.setWindowTitle("自定义信号")
  9. self.resize(500,500)
  10. self.move(500,500)
  11. self.setup_ui()
  12. def setup_ui(self):
  13. self.text= QLineEdit(self)
  14. self.text.setText('5')
  15. self.text.resize(100,100)
  16. self.text.move(50,50)
  17. self.signal.connect(self.cao) # 2.自定义信号连接槽函数;注意自定义信号只能类实例调用
  18. self.signal.emit() #3.发射信号
  19. def cao(self):
  20. self.text.setText('4')
  21. if __name__ =='__main__':
  22. app = QApplication(sys.argv)
  23. window = Window()
  24. window.show()
  25. sys.exit(app.exec_())

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/859588
推荐阅读
相关标签
  

闽ICP备14008679号