PySide6精简教程

2023-05-16

目录

  • 一、PySide6概述
  • 二、安装PySide6
  • 三、设计界面
  • 四、响应UI操作
  • 五、打包部署

一、PySide6概述

近几年,受益于人工智能的崛起,Python语言几乎以压倒性优势在众多编程语言中异军突起,成为AI时代的首选语言。在很多情况下,我们想要以图形化方式将我们的人工智能算法打包提供给用户使用,这时候选择以python为主的GUI框架就非常合适了。

QT是众多GUI框架里面非常著名的一款,它本身由C++开发,天然支持基于C++的GUI编程,编出来的图形化软件在当今众多GUI框架中运行效率几乎是天花板级别的,拥有完善的第三方库,极其适合数字图像处理、文档排版、多媒体、3D建模等专业软件开发。与此同时,QT还有一个强大的功能:支持跨平台,简单来理解,就是我们只需要编写一套代码就可以同时在windows、mac、linux上运行。

值得一提的是,QT对Python也有完善API支持,意味着我们可以规避C++编程的苦恼,使用更简洁的Python来代替C++开发QT应用,同样具备跨平台等优势。需要说明的是,目前有两种QT对应的Python工具:PySide和PyQt。这里首先介绍下两者的区别。

PySide是Qt公司的产品,PyQt是第三方公司的产品,二者用法基本相同,不过在使用协议上却有很大差别。PySide可以在LGPL协议下使用,PyQt则在GPL协议下使用。这两个协议的区别就是如果使用PyQt,那么你开发的软件必须开源,否则就存在被告的风险。而PySide就没有这种约束,不管是开发商业闭源软件还是开源软件,你都可以不开源代码,开不开源是你的自由。从这一点上来看,对于商业公司或者说有商业考虑的软件来说,我更倾向于推荐PySide,更何况PySide还是QT的亲儿子。虽然PySide和PyQt在协议上有不同,但是两者提供的接口几乎是完全一致的。目前市面上PyQt的教程完全适合PySide,因此,对于学习者来说学习任何一个都是可以的。

PySide目前常见的有两个版本:PySide2和PySide6。PySide2由C++版的Qt5开发而来.,而PySide6对应的则是C++版的Qt6。从PySide6开始,PySide的命名也会与Qt的大版本号保持一致,不会再出现类似PySide2对应Qt5这种容易混淆的情况。

在使用层面上,PySide2和PySide6无过多的差异,只有一点需要注意,使用PySide6开发的程序在默认情况下不兼容Windows7系统,这也是Qt6所决定的(即使是C++的QT6也不支持windows7)。

二、安装PySide6

对于PySide开发来说,我们不需要完整的安装几个G的Qt,可以像普通Python库一样直接通过pip安装就行,大概占用300MB空间(需要提前安装好python3以及pip)。

可以使用下面的命令安装:

pip install --upgrade pip
pip install pyside6 -i https://mirror.baidu.com/pypi/simple

通过这样简单的命令就可以完成安装。

基于PySide6开发GUI程序包含下面三个基本步骤:

  • 设计GUI,图形化拖拽或手撸;
  • 响应UI的操作(如点击按钮、输入数据、服务器更新),使用信号与Slot连接界面和业务;
  • 打包发布;

下面我们按照这个步骤来快速实现一遍。

三、设计界面

PySide为我们提供了两种开发界面的方式,一种叫QtWidget,是在网上教程中最常见的方式;另一种叫QML,是一种新型的开发方式,也是Qt正在努力推广的开发方式。在本文中,我们主要使用QtWidget这种方式。

使用QtWidget开发程序时,也有两种基本的使用方法,一种是通过designer开发界面,另一种是用代码手动开发界面。本文的目的是极简快速入门,所以使用designer这种方便的方式进行开发。

我们可以在cmd终端中使用下面的命令启动designer:

pyside6-designer

启动后designer界面如下所示:
在这里插入图片描述
这里我们选择Widget,并点击创建,之后打开的界面如下:
在这里插入图片描述
让我们来看一下界面里都有什么:
在这里插入图片描述

  • 组件选择区:用来选择组件,鼠标选择组件后就可以拖拽到窗口界面上,在本教程中会使用到一部分这里的组件;
  • 工作区:用来布置界面,调整窗口,我们可以把工作区中的窗口随意拖拽、调整大小;
  • 对象查看区:查看界面上共有多少组件,以及它们的布局关系;
  • 属性设置区:设置组件的属性,如文本、大小、名称等;

这里我们先把工作区中的窗口拖放到中间,再从组件选择区里拖拽一个Label组件到窗口上,如下图所示:
在这里插入图片描述
之后我们双击窗口里面的Label,输入“你好啊!世界”,我们会发现默认的Label大小并不能完全展示文本,所以我们把Label的宽度拉长(单击Label后,拖住周围的深蓝色方块即可调整大小),如下图所示:
在这里插入图片描述
接下来我们保存这个界面(Ctrl+S),或者在菜单栏选择“文件”->“保存”,我们将其保存到桌面一个名为hello的文件夹中,保存命名为hello.ui。

注意,PySide6是不能直接使用ui文件的,我们还需要将其转为py文件。首先cd到hello文件夹中,然后使用命令:

pyside6-uic hello.ui > ui.py

这样我们就会得到一个ui.py文件,我们可以打开看一下,里面都是一些界面代码,如下所示:

# -*- coding: utf-8 -*-
from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
    QMetaObject, QObject, QPoint, QRect,
    QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
    QFont, QFontDatabase, QGradient, QIcon,
    QImage, QKeySequence, QLinearGradient, QPainter,
    QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWidgets import (QApplication, QLabel, QSizePolicy, QWidget)

class Ui_Form(object):
    def setupUi(self, Form):
        if not Form.objectName():
            Form.setObjectName(u"Form")
        Form.resize(400, 300)
        self.label = QLabel(Form)
        self.label.setObjectName(u"label")
        self.label.setGeometry(QRect(180, 110, 101, 16))

        self.retranslateUi(Form)

        QMetaObject.connectSlotsByName(Form)
    # setupUi

    def retranslateUi(self, Form):
        Form.setWindowTitle(QCoreApplication.translate("Form", u"Form", None))
        self.label.setText(QCoreApplication.translate("Form", u"\u4f60\u597d\u554a\uff01\u4e16\u754c\uff01", None))
    # retranslateUi

如果不使用designer,那么这个ui.py就需要我们手动来写,所以,使用designer可以加快开发速度,减少工作量,提升开发效率。

这里还要个问题要解决,我们使用命令pyside6-uic转换出来的ui.py文件其保存格式不是utf-8,因此我们要用编辑器将其保存为utf-8才可以,否则后面加载该文件会报错:

四、响应UI操作

接下来我们就要写代码来把界面展示出来,新建一个名为hello的py文件:

# 导入sys
import sys

# 任何一个PySide界面程序都需要使用QApplication
# 我们要展示一个普通的窗口,所以需要导入QWidget,用来让我们自己的类继承
from PySide6.QtWidgets import QApplication, QWidget
# 导入我们生成的界面
from ui import Ui_Form
 
# 继承QWidget类,以获取其属性和方法
class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        # 设置界面为我们生成的界面
        self.ui = Ui_Form()
        self.ui.setupUi(self)

# 程序入口
if __name__ == "__main__":
    # 初始化QApplication,界面展示要包含在QApplication初始化之后,结束之前
    app = QApplication(sys.argv)
 
    # 初始化并展示我们的界面组件
    window = MyWidget()
    window.show()
    
    # 结束QApplication
    sys.exit(app.exec_())

注释中包含了详细的代码说明,接下来我们只要执行这个py文件,就可以看到我们的界面了:
在这里插入图片描述

五、打包部署

我们最终希望交给用户是一个纯粹的exe可执行文件(可以包含一些dll之类的动态库或配置文件),用户不需要安装Python依赖,直接双击就可以运行展示。下面我们来实现最后的这个环节。

下面主要以windows为例。

首选安装打包工具:

pip install pyinstaller -i https://mirror.baidu.com/pypi/simple
pip install auto-py-to-exe -i https://mirror.baidu.com/pypi/simple

运行:auto-py-to-exe,会自动打开浏览器,然后进入打包部署配置页面,如下图所示:
在这里插入图片描述

  • Script Location:选择要打包的py主程序;
  • One File:选生成单一文件;
  • Console Window:选择不显示命令行窗口;
  • Icon:可设置图标;
  • Additional Files:除了主程序以外其它的需要打包的文件;
  • Advanced:可设置UPX(从这里下载 https://upx.github.io/)然后点击“Convert .PY to .EXE”就会自动生成.exe文件了,在当前目录output子目录下。该特性用于进一步压缩exe体积。

最终配置如下所示:
在这里插入图片描述
最终在hello文件下会生成output文件夹,其中就生成了打包部署好的exe文件,如下图所示:
在这里插入图片描述到这里本文就完成了一个简单的基于PySide6的项目开发(虽然我们几乎没实现什么功能)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PySide6精简教程 的相关文章

  • esp8266 丢失固件 丢失程序问题

    1 首先esp8266 丢失固件 丢失程序问题已经解决 2 解决方法 我们制作了一个固件保护主板 xff0c 提供2种供电接口 xff0c 支持5v稳压 串口电平保护 xff0c 固件保护 xff0c 反电动势保护 xff0c 支持复位按键
  • printf重定向

    1 printf与fputc 对于 printf 函数相信大家都不陌生 xff0c 第一个C语言程序就是使用 printf 函数在屏幕上的控制台打印出Hello World xff0c 之后使用 printf 函数输出各种类型的数据 xff
  • ESP32_BLUFI代码移植过程遇到的问题

    1 先是运行esp32官方给的例程 xff0c 出现了错误报错如下 xff1a esp image Image length 1053648 doesn t fit in partition length 1048576 boot Fact
  • Java 中的 Iterator 迭代器详解

    x1f366 Iterator 接口 在程序开发中 xff0c 经常需要遍历集合中的所有元素 针对这种需求 xff0c JDK 专门提供了一个接口 java util Iterator Iterator 接口也是 Java 集合中的一员 x
  • 三.【NodeJs入门学习】POST接口

    上一节我们学习了get接口 xff0c 这一节我们自己来写一下post接口 1 复习一下 先复习一下上一节中get请求的步骤 上图是在入口app js中处理get请求 xff0c 先拿到请求的url xff0c 然后设置了一个函数handl
  • 多进程和多线程比较

    原文 xff1a http blog csdn net lishenglong666 article details 8557215 很详细 对比维度 多进程 多线程 总结 数据共享 同步 数据共享复杂 xff0c 需要用IPC xff1b
  • C++ 之头文件声明定义

    最近在学习 c 43 43 在编译与链接过程中遇到了一些定义与声明的问题 经过多处查阅资料 基本解惑 现记录与此 希望让后面人少走些弯路 C 43 43 的头文件应该用什么扩展名 目前业界的常用格式如下 implementation fil
  • arduino修改串口缓冲区大小的三种办法

    由于SoftwareSerial h默认只接收64字节串行缓冲区 xff0c Arduino会将之后接收到的数据丢弃 xff0c 不满足业务需求 以下三种方法是笔者参考网上各种资料总结出来 xff0c 对于WEMOS D1 R2 xff0c
  • C语言调用libcurl的一个简单例子

    首先我们创建一个php页面 xff1a lt meta http equiv 61 span class hljs string 34 Content Type 34 span content 61 span class hljs stri
  • 【C++】类构造函数、析构函数的调用顺序「完整版」

    一 全局变量 静态变量和局部变量 全局变量在程序开始时调用构造函数 在程序结束时调用析构函数 静态变量在所在函数第一次被调用时调用构造函数 在程序结束时调用析构函数 xff0c 只调用一次 局部变量在所在的代码段被执行时调用构造函数 xff
  • linux下使用shell发送http请求

    本文主要介绍如何在linux下使用shell发送http请求 一 curl 1 get请求 curl命令默认下就是使用get方式发送http请求 curl www span class hljs preprocessor baidu spa
  • 【STL真好用】1057 Stack C++(30)

    1057 Stack 30 分 Stack is one of the most fundamental data structures which is based on the principle of Last In First Ou
  • C++学习之头文件引用

    目录结构如下 test h的定义如下 xff1a ifndef TEST H define TEST H include lt vector gt include lt string gt using namespace std class
  • checksum 算法

    说明 checksum xff1a 总和检验码 xff0c 校验和 xff0c 可以理解为check xff08 校验 xff09 xff0c sum xff08 和 xff09 在数据处理和通信领域 xff0c 通过一定算法对传输的数据进
  • 解决cannot open shared object file: No such file or directory

    一 linux下调用动态库 so文件时提示 xff1a cannot open shared object file No such file or directory 解决办法 xff1a 1 此时ldd xxx查看依赖缺少哪些库 lib
  • cmake 使用(六)

    本文是 cmake 使用的第六篇 主要介绍如何设置编译器优化标志 上一篇的链接为 xff1a https blog csdn net QCZL CC article details 119825737 xff0c 主要介绍如何将自己的软件安
  • 8086寄存器介绍

    8086 有14个16位寄存器 xff0c 这14个寄存器按其用途可分为 1 通用寄存器 2 指令指针 3 标志寄存器和 4 段寄存器等4类 1 通用寄存器有8个 又可以分成2组 一组是数据寄存器 4个 另一组是指针寄存器及变址寄存器 4个
  • C++常用操作符:: -> . (例子详解)

    C 43 43 提供了三种访问类或者类对象的操作符 xff0c 他们是 双冒号 点 箭头 gt 这三种操作符有着各自的使用场景和定义 双冒号 A B 表示作用域运算符 A一定是一个类的名称或命名空间的名称 仅仅用于当B是A类 A命名空间的一
  • STM32中断优先级的分配以及中断原则

    STM32d的中断优先级由NVIC IPRx寄存器来配置 xff0c IPR的宽度为8bit所以原则上每个中断可配置的优先级为0 255 xff0c 数值越小优先级越高 xff0c 但对于大部分的 Cortex M3芯片都会精简设计 xff
  • 晶体管的结构、类型和三种组态

    晶体管有两大类型 双极型晶体管 BJT 和场效应管 FET 双极型晶体管又称为半导体三极管 晶体三极管 xff0c 简称晶体管 它由两个PN结组合而成 xff0c 有两种载流子参与导电是一种电流控制电流源器件 场效应管仅有一种载流子参与导电

随机推荐