目录
一、介绍
二、一个信号连接一个槽
三、一个信号连接多个槽
四、多个信号连接一个槽
五、自定义信号
1、创建自定义信号
2、让自定义信号携带值
在下图中
示例:
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())