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_()

image-20220417212840412

QApplication 提供了整个图形界面程序的底层管理功能,比如:初始化、程序入口参数的处理,用户事件(对界面的点击、输入、拖拽)分发给各个对应的控件,等等…;对 QApplication 细节比较感兴趣的话,可以点击这里参考官方网站;既然QApplication要做如此重要的初始化操作,所以,我们必须在任何界面控件对象创建前,先创建它。

QMainWindow、QPlainTextEdit、QPushButton 是3个控件类,分别对应界面的主窗口、文本框、按钮,他们都是控件基类对象QWidget的子类

要在界面上 创建一个控件 ,就需要在程序代码中 创建 这个 控件对应类 的一个 实例对象

image-20220417213222216

放在主窗口的控件,要能全部显示在界面上, 必须加上下面这行代码

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_()

image-20220417213905661

下面这样定义一个函数

def handleCalc():
    print('统计按钮被点击了')

然后,指定如果发生了 button 按钮被点击的事情,需要让 handleCalc 来处理,像这样

button.clicked.connect(handleCalc)

用QT的术语来解释上面这行代码,就是:把 button 被 点击(clicked) 的信号(signal), 连接(connect)到了 handleCalc 这样的一个 slot上

大白话就是:让 handleCalc 来 处理 button 被 点击的操作。

添加提示框

image-20220417214518068

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()

image-20220417220350972

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_()) # 确保主循环安全退出

image-20220417222735234

2.界面设计师

2.1 Qt Designer 简介

路径:\venv\Lib\site-packages\qt5_applications\Qt\bin,虚拟环境中的包下面

image-20220418091135007

双击打开:

image-20220418091210633

界面类似于 C# 开发的桌面程序的风格。

通过 Qt Designer 设计的界面,最终是保存在一个ui文件中的,大家可以打开这个ui文件看看,就是一个XML格式的界面定义。

2.2 简单介绍

拖拽控件之窗体上。通过修改对象的属性值。实现控件上文本的定义。

image-20220418092134108

选择对象进行修改,对象名一般要自己修改,后期绑定时间需要根据对象名称进行绑定;

image-20220418092306611

空间的对象名相当于C#中的name属性。

image-20220418092603416

点击窗体下的预览选项可以实现运行时界面的预览

保存到项目的目录下,一般创建一个ui的文件包;打开后是xml格式的文档。

image-20220418093247147

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_())

image-20220418095250334

在界面设计师上任意进行控件的布局,代码中会直接进行修改。实现了界面与功能的分离设计。

image-20220418095501163

2.4 将 ui 转换为 Python 代码;

在终端执行命令

# 命令
pyuic5 one.ui > ui_main.py

# pyuic5 路径文件 > 转换出的文件名

image-20220418100234987

# -*- 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 类加载到对应的程序中

image-20220418101103856

3.常用功能

3.1 界面布局(layout)

  • 布局方式

    • QHBoxLayout 水平布局
    • QVBoxLayout 垂直布局
    • QGridLayout 表格布局
    • QFormLayout 表单布局

    说明:水平与垂直布局和 CSS 中的flex相似;

    • image-20220419081354103
    • image-20220419081412577
  • 说明:不仅可以实现页面的布局,还可以实现界面的拉伸按比例缩放的效果

3.2 布局操作

两个控件进行布局。

image-20220419080841167

当需要将一个控件进行布局的时候

image-20220419082750065

注:当需要整个窗体都按照拉动窗体进行缩放的时候,需要将窗体对象进行设置布局选项。一般设置为垂直布局;

image-20220419083537871

3.3 界面布局建议

  • 先不使用任何 Layout,把所有控件 按位置 摆放在界面上;
  • 然后先从最内层开始 进行控件的 Layout 设定;
  • 逐步拓展到外层 进行控件的 Layout 设定;
  • 最后调整 layout 中控件的大小比例, 优先使用 Layout的 layoutStrentch 属性来控制;

3.4 小demo练习

image-20220419142721387

继续努力,终成大器;

posted @ 2022-04-19 14:33  紫青宝剑  阅读(461)  评论(0编辑  收藏  举报