前言
上期教程我们深刻了解了 QSS 样式,通过 QSS 可以很方便自定义自己组件的主题。装自己的逼,让别人无逼可装。
下面我们来讲讲 Qt 的信号槽。并且如何自定义信号槽事件。
什么是信号槽
其实第三期教程的时候就有讲到信号槽为何物。跳转链接
信号槽是 Qt 的事件响应机制。
通过信号槽可以在满足特定情况下触发相关的函数。
通过第四期教程的实战,我们知道 Qt 也自带了很多 虚函数 可以实现在特定情况下执行特定代码。
但是虚函数需要复写,不便于后续的调用。
因此虚函数只适合在类里面用,不适合在实例化的对象上使用。
那么如果我们自定义一个信号槽到虚函数当中,就可以在实例中使用信号槽触发相关功能了。
#
在第四期教程的实战中,我使用了 keyPressEvent 来实现 Esc 键退出编辑的效果的。
当然这个写法在类里面写是没有问题的,如果我希望组件外面也有一个专门的信号槽来处理 Esc 键触发的事件,我们就可以利用自定义信号槽来解决问题。
下面我模仿 QPushButton 的 clicked 信号槽,将这个信号槽添加到 QLabel 上的效果。
1 | # -*- coding:UTF-8 -*- |
上面加入兼容 Maya 外部执行的效果。
另外上面代码实现了,点击 label 就打印出 click 信息
下面我们来自定义信号槽
PySide 和 PyQt 开自定义信号槽的名称是不一样的,Qt.py 脚本是以PySide为基准的
PySide 使用 Signal() || PyQt 使用 pyqtSignal()
1 | from __future__ import print_function |
特别注意
clicked = Signal()
这个语句不可以写在 init 函数中。
python是支持变量写在类方法外部的,可以通过self来获取到方法外的变量。
另外这里用了 lambda 函数来实现打印效果。
在 Python3 中 lambda 可以使用 print ,因为 Python3 的 print 是个函数。
而在 Python2 中 print 是关键字,无法在 lambda 函数中执行。
在网上查找了一番,也是有解决方案的。
from __future__ import print_function
可以让 Python2 的print 升级成 Python3 的 print。 Stackoverflow解答
我们也可以给emit函数添加参数,这样调用的函数就可以获取到相关的传参。
1 | # -*- coding:UTF-8 -*- |
Qt 的自定义信号槽其实并不难,基本都是依靠虚函数提供的执行调用,然后让信号槽在特定条件下触发。
我们也可以在虚函数当中加入相关的判断,比如只有点击左上角的特定区域才可以 emit 信号,如此就实现条件更加丰富的自定义效果。
制定自定义的信号槽我只会这么多,更加复杂的用法可以参照官方的文档相关的函数。 QSignalTransition QSignalMapper
更为复杂的用法,其实我自己也没有怎么研究,也就不加赘述。
扩展说明
- 这里填个坑,如何让 PySide 的窗口如同 MEL 的窗口一样不会被遮挡。 参考这里
总结
自定义信号槽也结束了,至此我第一期教程宣布的所有内容已经完结。
下一期教程,我们再来一个实战,通过 PySide2 制作一个默写古诗的软件 <( ̄︶ ̄)>
敬请期待!~