赞
踩
目录
信号(signal)和槽(slot)是Qt的核心机制
在下图中
示例:
red信号和stop()槽函数进行连接
green信号和go()槽函数进行连接
只有这样连接后,发射的信号才可以调用相应的槽函数。
总结起来就一句话:连接后,信号发射,槽函数“启动”
- traffic_light.red.connect(stop)
- traffic_light.green.connect(go)
- # 在connect()方法中传入的是函数名
常见信号:
示例:
- import sys
- from PyQt5.QtWidgets import *
- class Window(QWidget):
- def __init__(self):
- super(Window, self).__init__()
- btn = QPushButton('Start', self)
- btn.clicked.connect(self.change_text)
- def change_text(self):
- btn = self.sender()
- if btn.text() == 'Start':
- btn.setText('Stop')
- else:
- btn.setText('Start')
- if __name__ == '__main__':
- app = QApplication([])
- window = Window()
- window.show()
- sys.exit(app.exec())
一个信号可以连接多个槽函数,也就是信号只用发射一次,就可以调用多个槽函数。
- import sys
- from PyQt5.QtWidgets import *
- class Window(QWidget):
- def __init__(self):
- super(Window, self).__init__()
- self.btn = QPushButton('Start', self)
- self.btn.clicked.connect(self.change_text) #注释1开始
- self.btn.clicked.connect(self.change_size) #注释1结束
- def change_text(self):
- if self.btn.text() == 'Start':
- self.btn.setText('Stop')
- else:
- self.btn.setText('Start')
- def change_size(self): # 2
- self.btn.resize(150, 30)
- if __name__ == '__main__':
- app = QApplication([])
- window = Window()
- window.show()
- sys.exit(app.exec())
QPushButton除了有clicked信号,还有pressed信号和released信号。
pressed信号是在按钮被“按下”那一刻发射,而released信号则是在按钮被“松开”后发射。
“按下”和“松开”其实就构成了一次单击,也就会发射clicked信号。
- import sys
- from PyQt5.QtWidgets import *
- class Window(QWidget):
- def __init__(self):
- super(Window, self).__init__()
- self.btn = QPushButton('Start', self)
- self.btn.pressed.connect(self.change_text) #注释1开始
- self.btn.released.connect(self.change_text) #注释1结束
- def change_text(self):
- if self.btn.text() == 'Start':
- self.btn.setText('Stop')
- else:
- self.btn.setText('Start')
- if __name__ == '__main__':
- app = QApplication([])
- window = Window()
- window.show()
- sys.exit(app.exec())
在PyQt中,各个控件内置的信号已经能够让我们实现许多功能需求,但是如果想要更加个性化的功能,我们还得借助自定义信号来实现。
自定义信号是通过pyqtSignal来创建的,接下来通过示例代码来演示自定义信号的创建过程。
- import sys
- from PyQt5.QtCore import *
- from PyQt5.QtWidgets import *
- class Window(QWidget):
- my_signal = pyqtSignal() # 1
- def __init__(self):
- super(Window, self).__init__()
- self.my_signal.connect(self.my_slot) # 2
- def my_slot(self):
- print(self.width())
- print(self.height())
- def mousePressEvent(self, event): # 3
- self.my_signal.emit()
- if __name__ == '__main__':
- app = QApplication([])
- window = Window()
- window.show()
- sys.exit(app.exec())
如果想要获取鼠标指针在窗口上的x坐标和y坐标,可以通过信号将坐标值发送过来
- import sys
- from PyQt5.QtCore import *
- from PyQt5.QtWidgets import *
- class Window(QWidget):
- my_signal = pyqtSignal(int, int) # 1
- def __init__(self):
- super(Window, self).__init__()
- self.my_signal.connect(self.my_slot)
- def my_slot(self, x, y): # 2
- print(x)
- print(y)
- def mousePressEvent(self, event): # 3
- x = event.pos().x()
- y = event.pos().y()
- self.my_signal.emit(x, y)
- if __name__ == '__main__':
- app = QApplication([])
- window = Window()
- window.show()
- sys.exit(app.exec())
- import sys
- from PyQt5.QtCore import *
- from PyQt5.QtWidgets import *
-
- class Window(QWidget):
- # 自定义信号,不带参数
- my_signal = pyqtSignal()
-
- def __init__(self,parent=None):
- super(Window, self).__init__(parent)
-
- self.btn1 = QPushButton("点击", self)
- self.btn1.move(400, 200)
-
- self.label1 = QLabel(self)
- self.label1.setText("未点击")
-
- # 连接信号与槽函数
- self.btn1.clicked.connect(self.my_dd)
- # 接收信号,连接到槽函数
- self.my_signal.connect(self.my_slot)
-
- def my_slot(self):
- self.label1.setText("点击啦!")
-
- def my_dd(self):
- # 发送自定义信号,无参数
- self.my_signal.emit()
-
- if __name__ == '__main__':
- app = QApplication([])
- window = Window()
- window.show()
- sys.exit(app.exec())
制作一个单击按扭来关闭窗口
拖一个button出来
点击菜单栏中的Edit,找到Edit Signal/slot,点它
鼠标左键按住button,朝着你喜欢的方向拖动,出现这样的红色箭头就松开
松开后点击左侧的clicked(),然后点击右侧的close()(右侧为空的话将下方的复选框勾上),如图
点击ok,esc退出,Ctrl+r预览,做完了
我们看下效果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。