1.4.6 自定义信号
在PyQt中,各个控件内置的信号已经能够让我们实现许多功能需求,但是如果想要更加个性化的功能,我们还得借助自定义信号来实现。本小节会详细介绍如何自定义信号,并通过自定义信号进行传值。
本小节的知识点相对于之前的部分要稍微难一些,如果对前面的信号和槽知识点还不是很熟悉,可以先跳过这一部分,等可以熟练地连接信号和槽后再来看。
1.创建自定义信号
自定义信号是通过pyqtSignal来创建的,接下来通过示例代码1-19来演示自定义信号的创建过程。
示例代码1-19
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())
运行结果如图1-28所示。
图1-28 控制台输出结果
代码解释:
#1 实例化一个pyqtSignal对象。
#2 将自定义信号与my_slot()槽函数连接。
#3 mousePressEvent()是鼠标按下事件函数,每当鼠标被按下时,该事件函数就会被执行(4.3节会详细讲解窗口事件)。my_siganl信号调用emit()方法将自己发射出去,这样my_slot()槽函数就会被执行,输出窗口的宽和高。
2.让自定义信号携带值
如果想要获取鼠标指针在窗口上的x坐标和y坐标,可以通过信号将坐标值发送过来,详见示例代码1-20。
示例代码1-20
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())
运行结果如图1-29所示。
图1-29 控制台输出结果
代码解释:
#1 要通过自定义信号传值,我们必须在实例化pyqtSignal对象时明确要传递的值的类型。由于x坐标和y坐标都是整型值,因此要给pyqtSignal传入两个int。
#2 槽函数也要稍做修改,需要增加两个参数,分别用于接收x坐标和y坐标。
#3 现在我们需要在鼠标按下事件中获取鼠标指针的x和y坐标,并通过emit()方法将其随信号一同发射出去。
除了整型值,我们还可以让自定义信号携带其他类型(包括Python语言所支持的值类型和PyQt自定义的数据类型)的值,详见表1-1。
表1-1 自定义信号可携带的值类型
对信号和槽机制就暂时讲到这里,希望大家能够花时间理解相关内容,这会让你在后续的PyQt程序编写中事半功倍。现在让我们进入本章的最后一个部分,即学会使用文档。