文章目录
PyQt5 学习总结
其实不得不承认,我对Qt和PyQt5的了解并不深入,还仅仅停留在基本应用的基础上。只是当前任务需要做一个有UI的应用,考虑到PyQt5的槽函数可以用Python做实现,入门的时间更短,才选的PyQt5。本篇文章旨在记录一些我遇到的基础问题和踩的坑(这些可能对大佬来说不算什么),让自己以后再用好查阅也和大家分享一下
1. PyQt5的配置 Python + Pycharm + PyQt5
在Pycharm中配置Python这自然不用说。PyQt5的配置也很简单,只需要安装PyQt5、PyQt5-sip、pyqt5-tools三个包就可以了。之后还需要再对QtDesigner和PyUIC做一些简单的配置
-
QtDesigner:一个可在Pycharm中打开,用于设计UI的可视化界面(用过C#、Android、Qt的同学应该很熟悉),空间布局和控件的设计都是所见即所得的方式,最后设计得到的UI会生成一个*.ui文件
-
PyUIC:用于将QtDesigner中生成的*.ui文件转化成Python可处理的*.py文件
1.1 QtDesigner的配置
在Pycharm中按照File -> Settings -> Tools -> External Tools,在如下界面点击+号新建工具
在新建工具的界面中,主要配置的参数有如下图所示的三个:
- Name:名字一般取为QtDesigner(当然你要想特立独行,可以试试别的,但是不推荐)
- Program:这是最重要的配置,这里需要选定的是QtDesigner的designer.exe文件,如果不太清楚这个文件在哪的同学,可以在Pycharm中点击你安装的pyqt5-tools包会出现这个包的安装路径,在这个路径下就能找到designer.exe文件,如下图所示。
- Working Directory: 这里需要指定一个宏,这个宏用于得到文件路径,直接点击右侧的“Insert macro”可以从里面选择到这个宏
1.2 PyUIC的配置
和QtDesigner的配置类似,在Pycharm中按照File -> Settings -> Tools -> External Tools,点击+号新建工具,具体配置如下,同样由三个需要配置的参数:
- Name:一般为‘P有UIC’,当然你要特立独行也可以,不过不推荐。
- Program:python的可执行文件,QtDesigner的可执行文件都找到了,可别说这个你找不到
- Working directory:用于得到文件路径的宏,点击右侧的"Insert Macro"可以找到
1.3 使用
在上述配置全部完成之后,在当前项目的右键菜单中可以找到两个新的External Tools,点击QtDesigner会出现一个可视化的UI设计界面。而PyUIC是用于将QtDesigner中得到的*.ui文件转化成python代码,所以需要先左键选定*.ui文件,再点击PyUIC,可以看到会生成一个*.py文件
2. 触发事件
我现在的项目中碰到的两种需要定义相应动作的情况为:改变当前窗口状态时的事件响应(最大化、最小化、关闭窗口等)、UI中存在的控件的事件响应(点击、滑动等)。如果还有其他的方式的话,后续再补充,这里只简单介绍我用到的一些东西,对于大多数的简单应用应该是足够的。
2.1 UI中存在的控件的事件响应
在Qt中控件的事件响应采用的是槽函数的机制,通过connect函数将特定控件的某些操作(点击、滑动、修改)和用于事件响应的函数连接起来,实例如下图。
红色线框标注的为一个槽函数的典型例子,其中主要包含了用黄色线框标识的三部分:第一部分为控件对象,第二部分为对控件的特定操作,第三部分通过connect函数将对控件的特定操作连接到一个特定的事件处理函数。
对于第一部分和第二部分设计到的控件和对控件的具体操作都有哪些,可以参考__jia666666__的系列博客(感谢大佬的耐心整理,真的是救了渣渣一命)。当然如果以前用过C#、Android这一类的语言的同学,对这些空间的功能应该都不会陌生,都是大同小异的。
对于第三部分connect函数中的函数,大体上有两种情况:带参数和不带参数的。
-
不带参数的:这种方式很简单,connect函数的参数直接为函数名
-
带参数的:这种方式要通过lambda表达式进行参数的传递,具体例子如下
self.demo_btn.clicked.connect(lambda: self.trigger_event(para_1, para_2, para_3))
2.2 当前窗口状态改变时的事件响应
在这一点上当时我纠结了很久,因为对Qt相关的东西并不熟悉(或者是因为我笨……),刚开始一直以为窗口状态变化的触发函数也需要通过connect来连接,后来才发现控件类中已经给出了事件函数的定义,只需要定义一个新类继承原有的控件对象类,然后在新类中重写窗口状态变化的触发函数,在创建控件时用继承了原始控件类的新类,而不是原始控件类,即可实现对窗口窗台改变的触发函数的定义。
如果觉得上面很绕(反正我是这么觉得的……),没关系,用一个具体例子说明一下该怎么用。
首先,给出一些比较常用的窗口事件,如下图(更多的窗口事件可以查看PyQt5源代码中对窗口类的定义):
比如,我的项目中,我需要在关闭当前主窗口时,出现一个弹窗,提醒我是否保存了当前的更改,如果已经保存了,则点击确定关闭主窗口,如果未保存则点击取消回到主界面。要实现这个功能,需要改写的主窗口事件为_closeEvent()_。流程有如下两步
- 首先我们定义一个继承了主窗口类_QMainWindow_的新类_NewQMainWindow_,在其中对_closeEvent()_进行重写,如下图,红框标出的两部分为改动部分
- 在创建新的主窗口类时,我们不再用原始的_QMainWindow_,而是用这个新的对窗口事件进行了改写的类,如下图,这样就完成了对窗口事件的改写
效果图如下,当我点击关闭当前主窗口时,会出现弹窗。