当前位置:   article > 正文

PyQt5的信号与槽函数_pyqt5 槽函数

pyqt5 槽函数

目录

一、介绍

二、一个信号连接一个槽

三、一个信号连接多个槽

四、多个信号连接一个槽

五、自定义信号

1、创建自定义信号

2、让自定义信号携带值

3、自定义信号与槽函数连接

六、可以在Qt Designer 中设置信号与槽


一、介绍

信号(signal)和槽(slot)是Qt的核心机制

  • 信号:是对象或空间发射出去的消息。(可以理解为事件)
  • 槽:接收信号。本质是一个函数或方法。(可以理解为事件函数)
    一个信号可以和多个槽来绑定,一个槽可以接收多个信号。

在下图中 

  • (1)widget就是PyQt中的控件对象。其实就是组件
  • (2)signal就是控件对象拥有的信号
  • (3)connect()方法用于连接信号和槽,
  • (4)slot是槽函数名称。

 示例:

red信号stop()槽函数进行连接

green信号go()槽函数进行连接

只有这样连接后,发射的信号才可以调用相应的槽函数。 

总结起来就一句话:连接后,信号发射,槽函数“启动”

  1. traffic_light.red.connect(stop)
  2. traffic_light.green.connect(go)
  3. # 在connect()方法中传入的是函数名

常见信号:

二、一个信号连接一个槽

示例:

  1. import sys
  2. from PyQt5.QtWidgets import *
  3. class Window(QWidget):
  4. def __init__(self):
  5. super(Window, self).__init__()
  6. btn = QPushButton('Start', self)
  7. btn.clicked.connect(self.change_text)
  8. def change_text(self):
  9. btn = self.sender()
  10. if btn.text() == 'Start':
  11. btn.setText('Stop')
  12. else:
  13. btn.setText('Start')
  14. if __name__ == '__main__':
  15. app = QApplication([])
  16. window = Window()
  17. window.show()
  18. sys.exit(app.exec())
  • 实例化一个QPushButton按钮控件之后,我们将按钮的clicked信号与自定义的change_text()槽函数连接起来。
  • 在槽函数中,我们首先通过text()方法获取到当前单击按钮的文本,如果是“Start”,就调用setText()方法将按钮的文本修改为“Stop”。而如果文本是“Stop”,就将其修改为“Start”。
  • 因为要在槽函数中使用btn对象,所以应该在类的初始化函数__init__()中将btn设置为成员变量,也就是self.btn。当然我们也可以直接通过sender()方法获取到当前发射信号的控件对象
  • 每个控件都有相应的内置信号,比如QPushButton控件有clicked、pressed、released等内置信号。当然我们也可以给控件或窗口自定义一个信号

三、一个信号连接多个槽

一个信号可以连接多个槽函数,也就是信号只用发射一次,就可以调用多个槽函数。

  1. import sys
  2. from PyQt5.QtWidgets import *
  3. class Window(QWidget):
  4. def __init__(self):
  5. super(Window, self).__init__()
  6. self.btn = QPushButton('Start', self)
  7. self.btn.clicked.connect(self.change_text) #注释1开始
  8. self.btn.clicked.connect(self.change_size) #注释1结束
  9. def change_text(self):
  10. if self.btn.text() == 'Start':
  11. self.btn.setText('Stop')
  12. else:
  13. self.btn.setText('Start')
  14. def change_size(self): # 2
  15. self.btn.resize(150, 30)
  16. if __name__ == '__main__':
  17. app = QApplication([])
  18. window = Window()
  19. window.show()
  20. sys.exit(app.exec())
  • clicked信号连接了change_text()槽函数和change_size()槽函数。
  • change_size()槽函数用于改变按钮的尺寸

四、多个信号连接一个槽

QPushButton除了有clicked信号,还有pressed信号和released信号。

pressed信号是在按钮被“按下”那一刻发射,而released信号则是在按钮被“松开”后发射。

“按下”和“松开”其实就构成了一次单击,也就会发射clicked信号。

  1. import sys
  2. from PyQt5.QtWidgets import *
  3. class Window(QWidget):
  4. def __init__(self):
  5. super(Window, self).__init__()
  6. self.btn = QPushButton('Start', self)
  7. self.btn.pressed.connect(self.change_text) #注释1开始
  8. self.btn.released.connect(self.change_text) #注释1结束
  9. def change_text(self):
  10. if self.btn.text() == 'Start':
  11. self.btn.setText('Stop')
  12. else:
  13. self.btn.setText('Start')
  14. if __name__ == '__main__':
  15. app = QApplication([])
  16. window = Window()
  17. window.show()
  18. sys.exit(app.exec())
  • 将pressed信号和released信号都跟change_text()槽函数连接起来。
  • 那么当按钮被“按下”(不“松开”)时,槽函数就会被调用,按钮文本从“Start”变成了“Stop”。
  • 当“松开”按钮后,槽函数再次被调用,按钮文本从“Stop”变回了“Start”。

五、自定义信号

在PyQt中,各个控件内置的信号已经能够让我们实现许多功能需求,但是如果想要更加个性化的功能,我们还得借助自定义信号来实现。

1、创建自定义信号

自定义信号是通过pyqtSignal来创建的,接下来通过示例代码来演示自定义信号的创建过程。

  1. import sys
  2. from PyQt5.QtCore import *
  3. from PyQt5.QtWidgets import *
  4. class Window(QWidget):
  5. my_signal = pyqtSignal() # 1
  6. def __init__(self):
  7. super(Window, self).__init__()
  8. self.my_signal.connect(self.my_slot) # 2
  9. def my_slot(self):
  10. print(self.width())
  11. print(self.height())
  12. def mousePressEvent(self, event): # 3
  13. self.my_signal.emit()
  14. if __name__ == '__main__':
  15. app = QApplication([])
  16. window = Window()
  17. window.show()
  18. sys.exit(app.exec())
  • 实例化一个pyqtSignal对象。
  • 将自定义信号与my_slot()槽函数连接。
  • mousePressEvent()是鼠标按下事件函数,每当鼠标被按下时,该事件函数就会被执行my_siganl信号调用emit()方法将自己发射出去,这样my_slot()槽函数就会被执行,输出窗口的宽和高。

2、让自定义信号携带值

如果想要获取鼠标指针在窗口上的x坐标和y坐标,可以通过信号将坐标值发送过来

  1. import sys
  2. from PyQt5.QtCore import *
  3. from PyQt5.QtWidgets import *
  4. class Window(QWidget):
  5. my_signal = pyqtSignal(int, int) # 1
  6. def __init__(self):
  7. super(Window, self).__init__()
  8. self.my_signal.connect(self.my_slot)
  9. def my_slot(self, x, y): # 2
  10. print(x)
  11. print(y)
  12. def mousePressEvent(self, event): # 3
  13. x = event.pos().x()
  14. y = event.pos().y()
  15. self.my_signal.emit(x, y)
  16. if __name__ == '__main__':
  17. app = QApplication([])
  18. window = Window()
  19. window.show()
  20. sys.exit(app.exec())
  • 要通过自定义信号传值,我们必须在实例化pyqtSignal对象时明确要传递的值的类型。由于x坐标和y坐标都是整型值,因此要给pyqtSignal传入两个int。
  • 槽函数也要稍做修改,需要增加两个参数,分别用于接收x坐标和y坐标。
  • 现在我们需要在鼠标按下事件中获取鼠标指针的x和y坐标,并通过emit()方法将其随信号一同发射出去。 

3、自定义信号与槽函数连接

  1. import sys
  2. from PyQt5.QtCore import *
  3. from PyQt5.QtWidgets import *
  4. class Window(QWidget):
  5. # 自定义信号,不带参数
  6. my_signal = pyqtSignal()
  7. def __init__(self,parent=None):
  8. super(Window, self).__init__(parent)
  9. self.btn1 = QPushButton("点击", self)
  10. self.btn1.move(400, 200)
  11. self.label1 = QLabel(self)
  12. self.label1.setText("未点击")
  13. # 连接信号与槽函数
  14. self.btn1.clicked.connect(self.my_dd)
  15. # 接收信号,连接到槽函数
  16. self.my_signal.connect(self.my_slot)
  17. def my_slot(self):
  18. self.label1.setText("点击啦!")
  19. def my_dd(self):
  20. # 发送自定义信号,无参数
  21. self.my_signal.emit()
  22. if __name__ == '__main__':
  23. app = QApplication([])
  24. window = Window()
  25. window.show()
  26. sys.exit(app.exec())

六、可以在Qt Designer 中设置信号与槽

制作一个单击按扭来关闭窗口 

拖一个button出来

点击菜单栏中的Edit,找到Edit Signal/slot,点它

鼠标左键按住button,朝着你喜欢的方向拖动,出现这样的红色箭头就松开

松开后点击左侧的clicked(),然后点击右侧的close()(右侧为空的话将下方的复选框勾上),如图

点击ok,esc退出,Ctrl+r预览,做完了

我们看下效果

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

闽ICP备14008679号