PyQt5(一)基本使用
PyQt5
参考文章:https://www.byhy.net/tut/py/gui/qt_03/
简介:主要用来开发 python 的桌面可执行程序。其他相关内容请查看相关文章
1.简单使用
参考文档:https://www.byhy.net/tut/py/gui/qt_02/
1.1 普通使用
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QPlainTextEdit
app = QApplication([])
window = QMainWindow()
window.resize(500, 400)
window.move(300, 310)
window.setWindowTitle('薪资统计')
textEdit = QPlainTextEdit(window)
textEdit.setPlaceholderText("请输入薪资表")
textEdit.move(10,25)# 就决定了 主窗口的 左上角坐标在 相对屏幕的左上角 的X横坐标10像素, Y纵坐标25像素这个位置。
textEdit.resize(300,350)
button = QPushButton('统计', window)
button.move(380,80)
window.show()
app.exec_()
QApplication
提供了整个图形界面程序的底层管理功能,比如:初始化、程序入口参数的处理,用户事件(对界面的点击、输入、拖拽)分发给各个对应的控件,等等…;对 QApplication 细节比较感兴趣的话,可以点击这里参考官方网站;既然QApplication要做如此重要的初始化操作,所以,我们必须在任何界面控件对象创建前,先创建它。
QMainWindow、QPlainTextEdit、QPushButton 是3个控件类,分别对应界面的主窗口、文本框、按钮,他们都是控件基类对象QWidget的子类
要在界面上 创建一个控件
,就需要在程序代码中 创建
这个 控件对应类
的一个 实例对象
。
放在主窗口的控件,要能全部显示在界面上, 必须加上下面这行代码
window.show()
最后 ,通过下面这行代码
app.exec_()
进入QApplication的事件处理循环,接收用户的输入事件(),并且分配给相应的对象去处理。
1.2 处理动作(signal 和 slot)
在 Qt 系统中, 当界面上一个控件被操作时,比如 被点击、被输入文本、被鼠标拖拽等, 就会发出 信号
,英文叫 signal
。就是表明一个事件(比如被点击、被输入文本)发生了。
我们可以预先在代码中指定 处理这个 signal 的函数,这个处理 signal 的函数 叫做 slot
。
说明:由于 python 解释器执行的时候是从上到下的执行顺序,因此在按钮上绑定处理函数之前,该函数应该已经被定义。
# -*- coding: utf-8 -*-
'''
@Time : 2022/4/17 21:26
@Author : ziqingbaojian
@File : demo.py
'''
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QPlainTextEdit
def handleCalc():
print('统计按钮被点击了')
app = QApplication([])
'''
省略代码见上部分
'''
button = QPushButton('统计', window)
button.move(380,80)
button.clicked.connect(handleCalc)
window.show() # 绑定执行函数
app.exec_()
下面这样定义一个函数
def handleCalc():
print('统计按钮被点击了')
然后,指定如果发生了 button 按钮被点击的事情,需要让 handleCalc
来处理,像这样
button.clicked.connect(handleCalc)
用QT的术语来解释上面这行代码,就是:把 button 被 点击(clicked) 的信号(signal), 连接(connect)到了 handleCalc 这样的一个 slot上
大白话就是:让 handleCalc 来 处理 button 被 点击的操作。
添加提示框
1.3 封装到类中
from PyQt5.QtWidgets import QApplication,QMainWindow,QPushButton,QPlainTextEdit,QMessageBox
class QtMain():
def __init__(self):
self.window=QMainWindow() # 实例化主窗口对象
self.window.resize(500,400) # 定义长宽
self.window.move(300,300) # 控件对象的 move 方法决定了这个控件显示的位置。
self.window.setWindowTitle('薪资统计') # 设置窗体名称
self.textEdit=QPlainTextEdit(self.window)
self.textEdit.setPlaceholderText("提示文本:请输入????")
self.textEdit.move(25,25)
self.textEdit.resize(300,350)
self.button=QPushButton('按钮上的文本',self.window)
self.button.move(380,80)# 注:此种方法类似与CSS中的绝对定位,
self.button.clicked.connect(self.handleCalc)
def handleCalc(self):
QMessageBox.about(self.window,'消息提示框','啊哈哈哈哈哈')
if __name__ == '__main__':
app=QApplication([])
qt_obj=QtMain()
qt_obj.window.show() #调用对象的实例变量的show()方法
app.exec()
1.4 类的进阶使用
进阶:主要是使用类的继承关系,进一步减少的代码的耦合性。
# 类的进阶使用
import sys
from PyQt5.QtWidgets import (
QApplication,QWidget,QDesktopWidget
)
class QtMainWindow(QWidget):
# QWidget()窗口界面的基本控件,它提供了基本的应用构造器。
#默认情况下,构造器是没有父级的,没有父级的构造器被称为窗口(window)。
def __init__(self):
super().__init__()# 执行父类的初始化方法
self.init_ui()
def init_ui(self):
'''将创建窗体和窗体中的中的元素给生成'''
self.setWindowTitle("我是窗体的标题")
self.resize(1228,550)
# 窗体居中显示
qr=self.frameGeometry()
cp=QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
# 显示出来
self.show()
if __name__ == '__main__':
app=QApplication(sys.argv) # 实现程序可以在shell脚本中运行
window=QtMainWindow()
window.show()#让控件在桌面上显示出来。控件在内存里创建,之后才能在显示器上显示出来。
sys.exit(app.exec_()) # 确保主循环安全退出
2.界面设计师
2.1 Qt Designer 简介
路径:\venv\Lib\site-packages\qt5_applications\Qt\bin
,虚拟环境中的包下面
双击打开:
界面类似于 C# 开发的桌面程序的风格。
通过 Qt Designer 设计的界面,最终是保存在一个ui文件中的,大家可以打开这个ui文件看看,就是一个XML格式的界面定义。
2.2 简单介绍
拖拽控件之窗体上。通过修改对象的属性值。实现控件上文本的定义。
选择对象进行修改,对象名一般要自己修改,后期绑定时间需要根据对象名称进行绑定;
空间的对象名相当于C#中的name属性。
点击窗体下的预览选项可以实现运行时界面的预览
保存到项目的目录下,一般创建一个ui的文件包;打开后是xml
格式的文档。
2.3 加载 ui 文件
import sys
from PyQt5.QtWidgets import QApplication,QMessageBox
from PyQt5.uic import loadUi #导入类
class QtWin:
def __init__(self):
self.ui=loadUi("../ui/one.ui") # 传入路径,加载ui
self.ui.button.clicked.connect(self.handleCalc)
def handleCalc(self):
print("啊哈哈哈哈哈")
if __name__ == '__main__':
app=QApplication(sys.argv)
obj=QtWin()
obj.ui.show()
sys.exit(app.exec_())
在界面设计师上任意进行控件的布局,代码中会直接进行修改。实现了界面与功能的分离设计。
2.4 将 ui 转换为 Python 代码;
在终端执行命令
# 命令
pyuic5 one.ui > ui_main.py
# pyuic5 路径文件 > 转换出的文件名
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'one.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 300)
self.textedit = QtWidgets.QPlainTextEdit(Form)
self.textedit.setGeometry(QtCore.QRect(40, 50, 101, 181))
self.textedit.setObjectName("textedit")
self.button = QtWidgets.QPushButton(Form)
self.button.setGeometry(QtCore.QRect(260, 230, 91, 31))
self.button.setObjectName("button")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "界面设计第一个窗口"))
self.textedit.setPlaceholderText(_translate("Form", "请输入提示文本"))
self.button.setText(_translate("Form", "双击修改文本"))
将 ui 类加载到对应的程序中
3.常用功能
3.1 界面布局(layout)
-
布局方式
- QHBoxLayout 水平布局
- QVBoxLayout 垂直布局
- QGridLayout 表格布局
- QFormLayout 表单布局
说明:水平与垂直布局和 CSS 中的flex相似;
-
说明:不仅可以实现页面的布局,还可以实现界面的拉伸按比例缩放的效果
3.2 布局操作
两个控件进行布局。
当需要将一个控件进行布局的时候
注:当需要整个窗体都按照拉动窗体进行缩放的时候,需要将窗体对象进行设置布局选项。一般设置为垂直布局;
3.3 界面布局建议
- 先不使用任何 Layout,把所有控件 按位置 摆放在界面上;
- 然后先从最内层开始 进行控件的 Layout 设定;
- 逐步拓展到外层 进行控件的 Layout 设定;
- 最后调整 layout 中控件的大小比例, 优先使用 Layout的 layoutStrentch 属性来控制;
3.4 小demo练习
继续努力,终成大器;