01. 初识PySide6

一、什么是PySide6

  PySide6 是一个 Python 的图形化界面(GUI)库,由 C++ 版的 Qt 开发而来,在用法上基本与 C++ 版没有特别大的差异。

  PySide6 是由诺基亚公司开发的,简单来说就是其 Qt 库的 Python 移植(原先是 C++的)。目前,支持 Python 的 Qt 库有两个 PyQt6 和 PySide6,PySide6 是 PyQt6 的兄弟。PySide6 是一个免费的软件,与 PyQt6 不同之处在于使用了 LGPL,允许 PySide6 免费的开发商业软件。

  PySide6 是 Qt 公司的产品,PyQt6 是第三方公司的产品,二者用法基本相同。不过,在使用协议上却有很大差别,PySide6 可以在 LGPL 协议下使用,PyQt6 则在 GPL 协议下使用。

  PySide6 为我们提供了两种开发界面的方式,一种是 QtWidget,早期比较常见;另一种叫 QML,是一种新型的开发方式,这也是 Qt 正在努力推广的开发方式。

二、PySide6的主要模块

PySide6的主要模块

PySide6主要类

  其中 QtWidgets、QtCore 和 QtGui 是基本模块,开发 GUI 时都会用这三个模块,其他模块是扩展模块。

  • QtWidgets 是窗口模块,提供窗口类和窗口上的各种控件(按钮、菜单、输入框、列表框等)类
  • QtCore 是核心模块,是其他模块的应用基础,包括五大模块:元对象系统属性系统对象模型对象树信号与槽。QtCore 模块涵盖了 PySide 核心的非 GUI 功能,此模块被用于处理程序中涉及的时间、文件、目录、数据类型、文本流、链接、MIME、线程或进程等对象。
  • QtGui 模块涵盖多种基本图形功能的类,包括事件处理、2D 图形、基本的图像和字体文本等
  • QtSql 模块提供了常用关系型数据库的接口和数据库模型,方便读写数据库中的数据
  • QtMultimedia 模块包含处理多媒体事件的类库,通过调用 API 接口访问摄像头、语音设备,播放音频和视频,录制音频和视频及拍照等
  • QtChartQtDataVisualization 模块用于数据可视化,可以绘制二维和三维数据图表
  • QtPrintSupport 模块提供打印支持,能识别系统中安装的打印机并进行打印,可以对打印参数进行设置,提供打印对话框和打印预览对话框
  • QtBluetooth 模块包含了处理蓝牙的类库,它的功能包括扫描设备、连接、交互等
  • QtNetwork 模块包含用于网络编程的类库,这组类库通过提供便捷的 TCP/IP 及 UDP 的 c/s 程式码集合,使得网络编程更容易
  • QtWebEngineQtWebEngineWidgets 模块借助开源的 Chromium 浏览器,在应用程序中嵌入 Web 浏览功能
  • QtXml 模块包含了用于处理 XML 的类库,提供实现 SAX 和 DOM API 的方法
  • QtOpenGLQtOpenGLFunctionsQtOpenGLWidgets 模块使用 OpenGL 库来渲染 3D 和 2D 图形,该模块使得 Qt GUI 库和 OpenGL 库无缝集成
  • QtDesigner 模块可以为 Qt Designer 创建自定义控件
  • QtSvg 模块为显示矢量图形文件的内容提供了函数
  • QtTest 模块包含了可以通过单元测试调试 PySide 应用程序的功能
  • QtStateMachine 模块可以创建和执行状态图
  • QtHelp 模块可以为应用程序集成在线帮助
  • QtConcurrent 模块支持多线程程序
  • Qt3DCoreQt3DInputQt3DRenderQt3DAnimationQt3DLogic、Q t3DExtras 等模块提供三维渲染、三维实时动画

三、PySide6的使用

  我们可以在终端中使用 pip 安装 PySide6 模块。默认是从国外的主站上下载,因此,我们可能会遇到网络不好的情况导致下载失败。我们可以在 pip 指令后通过 -i 指定国内镜像源下载

pip install pyside6 -i https://mirrors.aliyun.com/pypi/simple

  国内常用的 pip 下载源列表:

import sys

from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QLabel
from PySide6.QtGui import QFont

if __name__ == "__main__":
    app = QApplication(sys.argv)                                                # 创建一个QApplication类的实例

    window = QWidget()                                                          # 创建一个窗口

    window.resize(800, 600)                                                     # 设置窗口的尺寸
    window.setWindowTitle("基于PySide6的桌面应用程序")                            # 设置窗口标题 

    label = QLabel(window)                                                      # 创建一个标签控件
    label.setText("这是一个基于PySide6的桌面应用程序")                            # 设置标签的文本

    font = QFont("华文行楷", 24, QFont.Weight.ExtraBold)                         # 创建一个字体对象

    label.setFont(font)                                                         # 设置标签的字体

    window_size = window.size()                                                 # 获取窗口的大小,返回值是QSize类对象
    label_size = label.sizeHint()                                               # 获取标签对象的合适大小,返回值是QSize类对象
    label_x = window_size.width() // 2 - label_size.width() // 2
    label_y = window_size.height() // 2 - label_size.height() // 2
    label.setGeometry(label_x, label_y, label_size.width(), label_size.height())# 设置标签控件的位置和大小

    label.setStyleSheet("background-color: #99CCFF; color: #FF99CC")            # 设置标签的背景颜色和字体颜色

    window.show()                                                               # 展示窗口
    sys.exit(app.exec())                                                        # 进入程序的主循环并通过exit()函数确保主循环安全结束
app = QApplication(sys.argv)                                                    # 创建一个QApplication类的实例

  QApplication 是管理 GUI 应用程序的控制流程和设置的类。该类的构造方法接收一个列表类型的值,用来接受命令行参数。如果程序不需要接收命令行参数,可以直接传入空列表。如果程序需要接收命令行参数,则可以传入 sys.argv

window = QWidget()                                                              # 创建一个窗口

window.resize(800, 600)                                                         # 设置窗口的尺寸
window.setWindowTitle("基于PySide6的桌面应用程序")                                # 设置窗口标题 

  这里,我们使用 QWidgets 模块中的 QWidget创建窗体对象,然后调用 QWidget 类的 resize(width:int, height:int) 函数 设置窗口的大小,调用 setWindowTitle(title:str) 函数 设置窗体标题

label = QLabel(window)                                                          # 创建一个标签控件
label.setText("这是一个基于PySide6的桌面应用程序")                                # 设置标签的文本

  然后,我们使用 QtWidgets 模块中的 QLable 类创建了一个标签对象。这里,我们将 窗体对象 作为参数传递给 QLabel 的构造方法的作用是 指定窗体对象作为标签对象的父容器,这样标签才会显示在窗体上。然后我们使用 setText(text:str) 方法 设置标签对象的文字

font = QFont("华文行楷", 24, QFont.Weight.ExtraBold)                             # 创建一个字体对象

  接着,我们使用 QFont(name:str, pointSize:int, weigth:int) 方法 创建字体对象,其中 name指定使用的字体名称(如果是 Windows 系统,我们可以只写字体名使用 Windows 系统中自带的字体,如果我们要使用从网上自行下载的字体,则指定全路径名),pointSize 用来 指定字体的大小widget 用来 指定字体的粗细。Qt 使用从 1 到 1000 的权重等级,权重值为 1 时会很薄,而 1000 则会极其浓重。我们可以使用 QFont.Widget 枚举值指定,它预定的字体粗细枚举值如下:

QFont.Weight.Thin       = 100
QFont.Weight.ExtraLight = 200
QFont.Weight.Light      = 300
QFont.Weight.Normal     = 400
QFont.Weight.Medium     = 500
QFont.Weight.DemiBold   = 600
QFont.Weight.Bold       = 700
QFont.Weight.ExtraBold  = 800
QFont.Weight.Black      = 900
label.setFont(font)                                                             # 设置标签的字体

  在创建完字体对象之后,我们可以使用标签对象的 setFont(font:QFont) 方法 指定标签对象使用的字体

window_size = window.size()                                                     # 获取窗口的大小,返回值是QSize类对象
label_size = label.sizeHint()                                                   # 获取标签对象的合适大小,返回值是QSize类对象
label_x = window_size.width() // 2 - label_size.width() // 2
label_y = window_size.height() // 2 - label_size.height() // 2
label.setGeometry(label_x, label_y, label_size.width(), label_size.height())    # 设置标签控件的位置和大小

  我们可以使用标签对象的 setGeometry(x:int, y:int, width:int, heigth:int) 方法 指定标签控件的位置和大小。这里,我们先使用窗体对象的 size() 方法 获取窗体的大小,它返回的值是一个 QSize 对象。然后,我们使用该对象的 width() 方法和 heigth() 方法 获取窗体的宽和高。接着,我们使用标签对象的 sizeHize() 方法获取标签对象合适的大小,它返回的同样是 QSize 类型的对象。

这里,在调用 setGeometry() 方法重新设置标签对象的位置和大小前,不要使用 size() 方法获取标签对象的大小。这是因为此时获取的标签对象的大小是标签对象的默认大小,不是文本撑起后标签的大小,因此,我们需要使用 sizeHind() 方法获取文本撑起后标签的合适大小。

label.setStyleSheet("background-color: #99CCFF; color: #FF99CC")                # 设置标签的背景颜色和字体颜色

  然后,我们使用标签对象的 setStyleSheet(style_sheet:str) 方法 设置标签的样式。该方法接收一个字符串类型的参数,字符串的值类似于 CSS 的样式表(属性: 属性值)格式,多个样式之间使用 ; 分隔。

window.show()                                                                   # 展示窗口

  接着,我们调用窗体对象对象的 show() 方法 显示出来。运行程序,我们会发现这里的标签对象并没有调用 show() 方法,但它也在窗口中显示出来了。这是因为标签对象窗体作为父容器。如果父容器调用了 show() 方法显示,那么它对应的子控件即便不显示调用 show() 方法也会在父容器中显示出来。

sys.exit(app.exec())                                                            # 进入程序的主循环并通过exit()函数确保主循环安全结束

  这里我们通过 QApplication 对象的 exec() 方法进入程序的主循环,让 PySide6 程序正常运行起来。当用户正常关闭窗口时,exec() 方法会返回一个数值 0,我们将其传递给 sys.exit() 方法,从而让 Python 解释器正常退出。

posted @ 2024-12-07 20:53  星光映梦  阅读(928)  评论(0)    收藏  举报