PyQt编程快速上手
上QQ阅读APP看书,第一时间看更新

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 现在我们需要在鼠标按下事件中获取鼠标指针的xy坐标,并通过emit()方法将其随信号一同发射出去。

除了整型值,我们还可以让自定义信号携带其他类型(包括Python语言所支持的值类型和PyQt自定义的数据类型)的值,详见表1-1。

表1-1 自定义信号可携带的值类型

对信号和槽机制就暂时讲到这里,希望大家能够花时间理解相关内容,这会让你在后续的PyQt程序编写中事半功倍。现在让我们进入本章的最后一个部分,即学会使用文档。