PyQt5的安装与使用
简介
PyQt是Qt框架的Python语言实现,由Riverbank Computing开发,是最强大的GUI库之一。PyQt提供了一个设计良好的窗口控件集合,每一个PyQt控件都对应一个Qt控件,因此PyQt的API接口与Qt的API接口很接近,但不再使用QMake系统和Q_OBJECT宏。
PyQt5有超过620个类,6000个函数和方法,主要模块如下:
- QtCore:包含了核心的非 GUI 的功能。主要和时间、文件与文件夹、各种数据、流、URLs、mime 类文件、进程与线程一起使用。
- QtGui:包含了窗口系统、事件处理、2D 图像、基本绘画、字体和文字类。
- QtWidgets:包含了一系列创建桌面应用的 UI 元素。
- QtMultimedia:包含了处理多媒体的内容和调用摄像头 API 的类。
- QtBluetooth:包含了查找和连接蓝牙的类。
- QtNetwork:包含了网络编程的类,这些工具能让 TCP/IP 和 UDP 开发变得更加方便和可靠。
- QtPositioning:包含了定位的类,可以使用卫星、WiFi 甚至文本。
- Enginio:包含了通过客户端进入和管理 Qt Cloud 的类。
- QtWebSockets:包含了 WebSocket 协议的类。
- QtWebKit:包含了一个基 WebKit2 的 web 浏览器。
- QtWebKitWidgets:包含了基于 QtWidgets 的 WebKit1 的类。
- QtXml:包含了处理 xml 的类,提供了 SAX 和 DOM API 的工具。
- QtSvg:提供了显示 SVG 内容的类,Scalable Vector Graphics (SVG) 是一种是一种基于可扩展标记语言 (XML),用于描述二维矢量图形的图形格式(这句话来自于维基百科)。
- QtSql:提供了处理数据库的工具。
- QtTest:提供了测试 PyQt5 应用的工具。
安装
安装PyQt5
1 | pip install pyqt5 |
其中pyqt5-tools为Qt Designer拖拽式的界面设计工具。安装过程中可能会报如下错误:
1 | qt5-tools 5.15.2.1.2 has requirement click~=7.0, but you'll have click 8.0.1 which is incompatible. |
解决方案:
1 | pip install click~=7.0 |
Qt Designer介绍
Qt Designer是通过拖拽的方式放置控件,并实时查看控件效果进行快速UI设计。
整个画面的构成:
- 左侧的“Widget Box”就是各种可以自由拖动的组件
- 中间的“MainWindow – untitled”窗体就是画布
- 右上方的“Object Inspector”可以查看当前ui的结构
- 右侧中部的“Property Editor”可以设置当前选中组件的属性
- 右下方的“Resource Browser”可以添加各种素材,比如图片,背景等等
最终生成.ui文件(实质上是XML格式的文件),可直接使用,也可以通过pyuic5工具转换成.py文件。
Qt Disigner配置
在Pycharm中,依次打开 File – Settings – Tools – External Tools,点击 + Create Tool,配置如下:
1 | Name: QtDisigner |
PyUIC配置
PyUIC主要是把Qt Designer生成的.ui文件换成.py文件。
在Pycharm中,依次打开 File – Settings – Tools – External Tools,点击 + Create Tool,配置如下:
1 | Name: PyUIC |
PyRCC配置
PyRCC主要是把编写的.qrc资源文件换成.py文件。
在Pycharm中,依次打开 File – Settings – Tools – External Tools,点击 + Create Tool,配置如下:
1 | Name: PyRCC |
使用示例
创建一个空白的界面:
1 | import sys |
其中:
- Qapplication():每个GUI都必须包含一个Qapplication,argv表示获取命令行参数,如果不用获取,则可以使用[]代替。
- QMainWindow():类似一个容器(窗口)用来包含按钮、文本、输入框等widgets。arg标识可以获取命令行执行时的参数。
- setGeometry是用来定义 QMainWindow() 窗口的尺寸, 语法:setGeometry(x, y, width, height ),其中x,y为屏幕上的坐标点。
- show():用来显示窗口
- exit(app.exec_()):设置窗口一直运行指导使用关闭按钮进行关闭
PyQt5支持的常见Widgets有:QLabel、QComboBox、QCheckBox、QRadioButton、QPushButton、QTableWidget、QLineEdit、QSlider、QProgressBar等。
对于使用Pyqt5设置文本内容,使用Qlabel:
1 | import sys |
按钮与事件:
1 | import sys |
- button.clicked.connect() 在按钮点击后执行特定的事件。
常见Widgets介绍
QLabel
用于显示文本或图像。没有提供用户交互功能,标签的外观可以通过各种方式进行配置。
QLabel可以包含以下任何内容类型:
内容 | 设置 |
---|---|
纯文本 | 将字符串传递给setText() |
富文本 | 将富文本传递给setText() |
图像 | 将QPixmap对象传递给setPixmap() |
动画 | 将QMovie对象传递给setMovie() |
数字 | 将int或double数字传递给setNum(),将数字转换为纯文本 |
空 | 与纯文本相同。这是默认的,由clear()设置 |
QComboBox
组合框(也就是下拉框)是一个显示当前项目的选择小部件,可以弹出可选项目列表。组合框可以是可编辑的,允许用户修改列表中的每个项目。
QCheckBox
这是一个复选框,具有两种状态的小部件:打开和关闭。通常用于表示可以启用或禁用的应用程序中的功能。
QRadioButton
单选按钮为用户提供多选一的选择,是一种开关按钮。是否选择状态通过isChecked()方法判断。isChecked()方法返回值True表示选中,False表示未选中。
QLineEdit
是一个单行文本框控件,可以输入单行字符串,无法换行输入。多行可用QTextEdit
。
QPushButton
这是一个切换按钮,有两种状态:按下和未按下。通过点击它们在这两种状态之间切换。
QTableWidget
是Qt中常用显示数据的表格。
QSlider
这是一个滚动条,具有简单句柄的小部件,可以来回拉动。这样就可以为特定任务选择一个值。有时使用滑块比输入数字或使用旋转框更自然。
QProgressBar
这是一个进度条,是处理冗长任务时使用的小部件,以便用户知道任务正在进行中。可以设置进度条的最小值和最大值。默认值为0和99。
QCalendarWidget
提供基于月度的日历小部件。它允许用户以简单直观的方式选择日期。
对话框类控件
一些提示框,如选择字体、颜色等,所有对话框的父类是QDialog
,子类如下。
控件 | 描述 |
---|---|
QMessageBox | 用于提示信息, 如警告、询问和严重出错等。 |
QFileDialog | 用于打开文件和保存文件,可以设置过滤器限制文件后缀名。 |
QFontDialog | 用于设置字体。 |
QInputDialog | 用于控件的标准输入,如getInt 只能获得整数输入。 |
QColorDialog | 用于设置颜色。 |
日期类控件
用日期类的控件输入,可以避免用户的输入不规范。
控件 | 描述 |
---|---|
QCalendar | 以网格日历的形式输入日期,可以获取日期,日期改变后发射信号 |
QDateTimeEdit | 可编辑日期,感觉不好用,可以设置为弹出日历。 |
QCalendar | 以日历的形式输入日期 |
QCalendar | 以日历的形式输入日期 |
容器
所开发的程序包含太多控件,一个窗口装载不下或者装载太多控件而不美观,应该使用容器装载更多的控件。
控件 | 描述 |
---|---|
QTabWidget | 一个选项卡,一个页面区域,单击选项卡查看各个页面。 |
QDockWidgetWidget | 浮动窗口,类似与Dev C++ 中的底层Debug窗口,保持浮动状态或者在制定位置附加到主窗口。 |
QScrollBar | 提供水平或者垂直的滚动条,扩大窗口的有效装载面积。 |
QGroupBox | 下拉框,就是,一个页面内一直向下拖动 |
实战
简易的天气查询软件:
使用Qt Designer设计一个界面
用到的控件有Button,GroupBox,Label,ComboBox,TextEdit,同时定义了两个按钮queryBtn及clearBtn,分别用来查询及清空天气数据。需要绑定槽函数,方法如下:
- 在Qt Designer右下角选择[信号/槽编辑器],点击+号新增
- 分别选择queryBtn及clearBtn,选择信号clicked(),接收者Dialog及槽accept(),(槽函数这里不知道如何定义,后期在代码里再进行修改)
以上完成后保存为Weather.ui文件。
转换.ui文件为.py文件
PyQt5支持直接使用.ui文件:
1 | import sys |
但是为了更好的自定义及修改上面的槽函数,可以使用External Tools – PyUIC,即可生成Weather.py,实际运行命令如下:
1 | python -m PyQt5.uic.pyuic Weather.ui -o Weather.py |
其中,需要把两个按钮绑定的槽函数:
1 | # self.queryBtn.clicked.connect(Dialog.accept) |
最终的Weather.py内容如下:
1 | # -*- coding: utf-8 -*- |
调用MainDialog
在MainDialog中调用界面类Ui_Dialog,然后在其中中添加查询天气的业务逻辑代码,这样就做到了界面显示和业务逻辑的分离。新增demo.py文件, 在MainDialog类中定义了两个槽函数queryWeather()和clearText(),以便在界面文件Weather.ui中定义的两个按钮(queryBtn和clearBtn) 触发clicked信号与这两个槽函数进行绑定。
完整代码如下:
1 | import sys |
运行demo.py并执行查询后的效果:
将代码打包成exe文件
将.py文件打包成可执行的exe在Python中称为freezing,常用的工具有:PyInstaller,py2exe,cx_Freeze,bbfreze,py2app等。
- py2exe:软件更新已经不活跃。
- pyinstaller:明确支持win8、win10、理论上支持win7,,支持macOS,linux。可以打包成文件夹形式内含exe入口执行文件的形式,也可以是一个单独的exe文件。
- fbs:基于PyInstaller,使用起来更加方便
这里以fbs为例。
fbs的安装方法:
1 | pip install fbs |
在命令行中输入:
1 | fbs startproject |
执行完成后需要输入一些APP的名称等。完成后会生成如下目录:
将刚才编写的PyQt5的代码(demo.py和Weather.py)拖到src/main/python
文件夹下,删除原有的main.py,并将demo.py修改为main.py。然后打开 main.py,在文件头部添加如下代码:
1 | from fbs_runtime.application_context.PyQt5 import ApplicationContext |
完成后执行:
1 | fbs freeze |
即可实现打包,生成的exe可执行文件在\target\MyApp
文件下。