Python学习笔记——PyQt入门
简介
PyQt5是作为一套Python模块实现的,已经有超过620个类和6000个函数与方法。它是一个运行在所有主流操作系统上的多平台组件,包括Unix,Windows和Mac OS。PyQt5是双重许可的。开发者可以选择GPL和商业许可。
常用控件
按钮类 |
QPushButton 普通按钮 |
|
点击按钮就会触发一个clicked()信号 |
QRadioButton 单选框 |
|
可以在选中或者未选中之间切换,定义了“多选一”的选择 |
|
QCheckBox 复选框 |
|
提供了一个带文本标签的复选框,提供的是“多选多”的选择 |
|
显示组件 |
QLabel 标签 |
|
显示文字或者图片,只读的,不允许对内容进行更改 |
QTextBrowser 文本区域 |
|
用于显示大段文本 |
|
QTableView表格视图控件 |
|
需要和QStandardItemModel配套使用,这套框架是基于MVC设计模式设计的 |
|
输入组件 |
QLineEdit 单行文本框 |
|
单行文本输入 |
QTextEdit 多行文本框 |
|
多行文本输入(富文本) |
|
QPlainTextEdit多行文本框 |
|
多行文本输入(纯文本) |
三大窗口--mainwindow、dialog和widget
Mainwindow可以显示菜单,工具栏,状态栏、托盘等功能,作为主应用程序窗口。
Dialog通常作为一个顶层窗口出现,允许用户进行一些选择,并返回用户选择的结果。然后应用程序就可以根据用户刚才的选择决定下一步做什么。
Widget类是是用户界面的一个基本单元,每种类型的组件都是Widget的子类。每个Widget可以放置在一个UI内或者作为一个独立的窗口。
在新建一个ui文件时,如果是主界面,就选择QMainWindow;如果是*窗口,就选择QDialog;如果不确定或者前两种情况都有,就选择QWidget。
由于Qt Designer和PyUIC两个工具的存在,用可视化编程再自动生成代码的开发方式非常方便。但是在使用的时候需要一些技巧,就是不要去修改PyUIC生成的.py文件,可以在主程序中重写一个类去继承它,并且把需要增加的方法也放到子类里面。这样当我们再对ui文件进行修改,就不需要再做太多的重复工作。
信号和槽
所有的GUI程序都是事件驱动的。事件主要由用户触发,但也可能有其他触发方式。PyQt5有一个独特的signal&slot(信号槽)机制来处理事件。
sender是发出信号的对象。receiver是接收信号的对象。slot(插槽)是对信号做出反应的方法。信号槽用于对象间的通信。signal在某一特定事件发生时被触发,slot可以是任何callable对象。当signal触发时会调用与之相连的slot。
下面一段程序是使用信号槽的例子:
# 触发RecButton的clicked事件,执行显示对应窗口的时间
self.RecButton.clicked.connect(self.ToRecognize)
在这里我们主窗口RecButton按钮的clicked信号连接到主窗口的ToRecognize函数插槽。当RecButton按钮被按下,clicked信号触发,执行ToRecognize函数。
一个例子
要求设计一个软件,主界面上三个按钮,对应实现三种功能。编程思路大体如下:
1. 用Qt Designer设计一个Mainwindow.ui文件和三个Dialog.ui文件;再用PyUIC将其分别生成对应的.py文件。
2. 从生成的.py文件加载窗口类
from mainwindow import Ui_MainWindow
from RecognizeDialog import Ui_RecognizeDialog
from RegisterDialog import Ui_RegisterDialog
from ManagementDialog import Ui_ManagementDialog
3. 在主程序中重写类分别去继承原来的类
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUi(self)
class RecognizeDialog(QMainWindow, Ui_RecognizeDialog):
......
class RegisterDialog(QMainWindow, Ui_RegisterDialog):
......
class ManagementDialog(QMainWindow, Ui_ManagementDialog):
......
4. 在主窗口类中定义显示Dialog窗口的函数
class MainWindow(QMainWindow, Ui_MainWindow):
......
# 定义对应的显示函数
def ToRecognize(self):
self.Recognize = RecognizeDialog()
self.Recognize.show()
def ToRegister(self):
self.Register = RegisterDialog()
self.Register.show()
def ToShowUsers(self):
self.ShowUsers = ManagementDialog()
self.ShowUsers.show()
5. 在主窗口类中建立信号&槽,将上一步定义的显示函数作为槽,将对应button的clicked事件作为信号
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
......
self.Recognition.clicked.connect(self.ToRecognize)
self.Register.clicked.connect(self.ToRegister)
self.ShowUsers.clicked.connect(self.ToShowUsers)
6. 在三个Dialog窗口类中定义相关函数,实现需要的功能。
class RecognizeDialog(QMainWindow, Ui_RecognizeDialog):
......
def function1(self, Dialog):
......