【python学习】PyQt基础学习以及一个信息论与编码课设实例
这学期的信息论与编码的课设需要用编程语言实现霍夫曼、费诺以及香农编码,要具备在windows下的可视化操作界面,因此就选用PyQt作为开发工具,本篇博客记录一下PyQt的基础以及课设的实例
参考:
《PyQt5从入门到实践》
PyQt5官方帮助文档
QApplication
PyQt基础
PyQt就是Qt的python接口,目前主要有3个版本:PyQt3、PyQt4以及PyQt5,其中PyQt5不向下兼容PyQt4,且官方默认只提供对python3.x的支持
PyQt5的主要的类如下:
PyQt5的主要模块如下:
开发环境搭建
开发的工具如下:
- Python
- Pycharm
- Packet
- pyqt5
- pyqt5-tools
- pyqt5designer
这里就记录一下如何在Pycharm中配置PyQt5,首先要安装需要的工具包:
接着要配置一些工具(PyQt5创建GUI图形用户界面程序时,会生成扩展名为.ui的文件,因此需要工具将其转换为.py文件;同时还需要PyQt5的设计器):
- 添加安装pyqt5designer模块时自动安装的designer.exe,在Working directory中输入
$ProjectFileDir$,表示项目文件目录
- 添加将.ui文件转换为.py文件的转换工具,选择虚拟环境目录下的python.exe(Scripts文件夹中),然后在Arguments输入将.ui文件转换为.py文件的命令,在Working directory中输入
$FileDir$,表示.ui文件所在的路径
完成配置后,在Tools->External Tools中可以看到这两个工具:
Qt Designer
Qt Designer是一个可视化GUI设计工具,可以在Tools中直接打开,直接显示新建窗体窗口,列举了Qt支持的几种窗口类型:
- Dialog with Buttons Bottom:按钮在底部的对话框窗口
- Dialog with Buttons Right:按钮在右上角的对话框窗口
- Dialog without Buttons:没有按钮的对话框窗口
- Main Window:一个带菜单、停靠窗口和状态栏的主窗口
- Widget:通用窗口
选择后就可以开始设计,Qt Designer的几个主要组成部分如下:
- 菜单栏
- 工具栏
- 工具箱
- 窗口设计区域
- 对象查看器
- 属性编辑器
- 信号/槽、动作、资源编辑器
同时可以在Widget Box工具箱中选用相应的控件即可开始设计自己的GUI
- 如果设计完成,可以在窗体->预览于选择预览方式,观察实际运行的效果
- 可以在窗体->View Python Code中查看对应的Python代码;也可以直接在pycharm中选择保存好的.ui文件,选择Tools->External Tool->PyUIC即可
生成了代码后还需要设置程序入口并显示,代码如下:
import sys
import coding # coding就是通过.ui文件生成的.py文件,.ui文件的名字是什么就import什么
from PyQt5 import QtCore, QtGui, QtWidgets
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = coding.Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
关于这个程序的理解:
- sys模块提供访问由解释器使用或维护的变量的接口,并提供了一些函数和解释器进行交互,操控python运行时的环境
- sys.argv:
- sys.exit:
- QtWidgets模块包含了构建界面的一系列UI元素组件
- QApplication:对于任一使用Qt的GUI应用,只能有一个QApplication对象
- QMainWindow:QMainWindow是Qt的顶层窗口,使用它代表创建窗体对象
- Ui_MainWindow就是.ui文件转换为.py文件生成的类,setupUi就是对对象进行初始化设置
- MainWindow.show()用于显示窗体
PyQt5窗口设计基础
PyQt5的窗口就是向用户展示信息的可视化界面,是GUI程序的基本单元
PyQt5窗口创建完成后,可以通过属性对窗口进行设置,这些属性可以在属性编辑器中进行设置,也可以直接通过代码来实现,其常用的属性如下:
- 窗口的对象名称,相当于窗口的标识,是唯一的,在编写代码时,对窗口的任何设置和使用都是通过该名称进行操作的,默认名称是MainWindow,可通过objectName来进行修改
如果需要使用python代码进行设置的话,需要使用一个函数:MainWindow.setObjectName("MainWindow") - 窗口的标题栏名称通过windowTitle设置,也可以直接用python中的函数:
MainWindow.setWindowTitle("标题栏") - 窗口的大小通过geometry属性设置,也可以直接用python中的函数:
MainWindow.resize(252,100) - 窗口的样式可以使用setWindowFlags()函数设置:
setWindowFlags(Qt.WindowFlags),其中Qt.WindowFlags参数表示要设置的窗口样式- 对窗口样式的设置要在初始化窗体后才会起作用,即要在setupUi()函数后执行
信号与槽
信号(signal)与槽(slot)是Qt的核心机制,也是进行PyQt5编程时对象之间通信的基础,在PyQt5中,每一个QObject对象(包括各种窗口和控件)都支持信号与槽机制,通过信号与槽的关联就可以实现对象之间的通信,当信号发射时,连接的槽函数(方法)将会自动执行,在PyQt5中,信号与槽是通过对象的signal.connect()方法进行连接
PyQt5的窗口控件中有很多内置的信号与槽,PyQt5中使用信号与槽的主要特点如下:
- 一个信号可以连接多个槽
- 一个槽可以监听多个信号
- 信号与信号之间可以互连
- 信号与槽的连接可以跨线程
- 信号与槽的连接方式可以是同步,也可以是异步
- 信号的参数可以是任何的python类型
接下来用一个简例通过信号与槽实现一个单击按钮关闭主窗口的效果:
- 首先添加一个PushButton,并设置按钮的text属性为"关闭"
- 在菜单栏中选择"编辑信号/槽",然后选中关闭按钮,按住鼠标左键拖动至窗口的空白区域
- 松开鼠标后,会自动弹出配置连接,选中"显示从QWidget继承的信号和槽"复选框,然后在上方的信号与槽列表分别选中"clicked()"和"close()",完成信号与槽的关联
- 使用PyUIC工具将.ui文件转换为.py文件,然后编写python显示窗口并测试
PyQt5的常用控件
控件是用户可以用来输入或操作数据的对象,在PyQt5中控件的基类是QFrame类,而QFrame类继承自QWidget类,QWidget类是所有用户界面对象的基类
Qt Designer中默认对控件进行了分组:
文本类控件
文本类控件主要用来显示或者编辑文本信息
Label:标签控件
主要用于显示用户不能编辑的文本,标识窗体上的对象
按钮类控件
实例:信息论与编码课程设计
课程设计要求利用编程语言实现霍夫曼、费诺、香农编码
- 编码要求
- 霍夫曼编码:实现任意Q符号的N重序列信源的最优R进制编码(8≤Q≤15;2≤R≤5;1≤N≤3)
- 费诺、香农编码:实现任意Q符号的二进制编码(Q≥10)
- 编程要求
- 编写的程序应具备在windows下的可视化操作界面,不同的编码类型用不同的菜单加以分割
- 对于霍夫曼编码应该具备Q、N、R的能力,而费诺、香农编码能输入Q
- 不同编码类型应当展现编码的结果,平均码长、信息熵等性能指标