系列文章目录
PySide6学习 - 基础篇
PySide6学习 - 开发实践篇
文章目录
前言
本篇主要通过两个简单的示例,描述如何去搭建属于我们的第一个PySide6 程序,其中第一个程序非常简单,没有什么额外的语法使用,只是单纯的体验一下PySide6,第二个程序是一个最小框架程序,带有一点框架的东西。
另外会介绍一下常见的控件操作有哪些。
如果想对PySide6 有一个更深入的了解,可以参考github上的“PySide6 代码式教程”
后续考虑出两篇博客分别对两个比较典型的PySide相关项目进行一个解读。
1. 第一个程序
1.1 简单实现
代码
import sys
from PySide6.QtWidgets import QApplication, QLabel
app = QApplication(sys.argv)
label = QLabel("Hello World!")
label.show()
app.exec_()
运行效果
一个简单的Hello Workd!
代码解读
-
- 从PySide6.QtWidgets 模块中 引入 QApplication, QLabel
from PySide6.QtWidgets import QApplication, QLabel
最初我以为QApplication 和QLabel是函数(我对python并不是很熟悉),但是搜了一下发现其实他们是两个类。
那么也就是说我们引入了两个类,然后调用
QApplication(sys.argv)和QLabel("Hello World!")
是实例化两个对象的操作。-
QApplication
QApplication 是 Qt 框架中的一个重要类,它起到了管理应用程序的作用。QApplication 类是所有基于 Qt 的图形用户界面(GUI)应用程序的核心,它提供了一些必要的功能和方法来初始化和管理应用程序的事件循环、窗口系统和其他相关资源。
也就是说这里是初始化QT的地方- 初始化应用程序:在使用 Qt 构建 GUI 应用程序时,通常需要在应用程序的入口点创建一个 QApplication 对象,这样可以确保正确初始化 Qt 库,并为应用程序提供必要的上下文环境。
- 管理事件循环:QApplication 类负责处理和分发应用程序的事件。在调用 QApplication.exec_() 方法后,将进入事件循环,该循环负责监听和处理用户输入、系统事件和其他与应用程序交互的事件。通过事件循环,QApplication 使得应用程序能够响应用户的操作,并实现图形界面的交互性。
- 管理窗口系统:QApplication 类负责与底层窗口系统进行交互,并提供一些方法来管理应用程序的窗口。它负责创建和销毁窗口、管理窗口的布局和外观、处理窗口焦点、处理窗口的最小化、最大化和关闭等。通过 QApplication,开发人员可以方便地创建和管理应用程序的窗口界面。
- 提供应用程序级别的设置和功能:QApplication 类还提供了一些应用程序级别的设置和功能,如处理命令行参数、支持国际化、设置应用程序的图标和名称等。通过这些功能,开发人员可以定制和配置应用程序的行为和外观。
-
Qlabel
QLabel是Qt框架中的一个控件类,用于显示文本或图像。它是Qt中常用的用户界面元素之一,用于在应用程序的界面上显示静态文本或图像内容。- 显示文本:通过setText()方法可以设置QLabel显示的文本内容。
- 显示图像:通过setPixmap()方法可以设置QLabel显示的图像内容。
- 文本格式:可以通过setFont()方法设置文本的字体样式,通过setAlignment()方法设置文本的对齐方式。
- 自动换行:可以通过setWordWrap()方法设置文本是否自动换行。
- 链接和悬停提示:可以通过setOpenExternalLinks()方法设置文本中的链接是否可点击,并通过setToolTip()方法设置悬停提示信息。
- 样式表:可以使用样式表对QLabel进行样式定制,改变文本颜色、背景色等外观。
也就是说QLabel这个类中有很多的上述成员,虽然我对这些成员不熟悉,但是我应该可以问下GPT,调用哪个函数可以设置lable的对齐方式
-
- 初始化QT 通过调用
app = QApplication(sys.argv)
。 然后获得QT的管理app对象 # 2. 控件常见的操作方法
- 初始化QT 通过调用
-
- 使用
label = QLabel("Hello World!")
创建一个显示文本的控件,并且返回该控件对象
- 使用
-
-
使用
label.show()
调用该对象的指定方法来显示文本
在QT中当创建一个 QLabel 对象时,默认情况下,它是隐藏的,即不会在窗口中显示出来。要使 QLabel 控件显示在窗口中,需要调用其 show() 方法。但是如果父控件调用了show()方法之后,后续子控件就不需要调用show()方法了。当设置为不可见时,窗口上的控件被设置为不可见后被隐藏,但不会被释放,仍占据原先的位置
.setVisible() 设置可见/不可见 .isVisible() 获取可见状态 .hide() 设为不可见,等同于.setVisible(False) .show() 对于非窗口的控件,等同于.setVisible(True)
-
-
app.exec_()
进入QT的主循环了,开始执行代码,只有执行到了这,Label才会被显示。(其实可以想一下主循环中运行的无非就是 事件调度器、窗口管理器、定时器等这些需要不断循环运行监测的功能)
1.2 最小框架实现
代码
import sys
from PySide6 import QtCore, QtGui, QtWidgets
class MyWidget(QtWidgets.QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setWindowTitle("空白测试模板")
self.resize(800, 600)
self.setup_ui()
def setup_ui(self) -> None:
"""设置界面"""
# 在此处编写设置UI的代码
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = MyWidget()
window.show()
sys.exit(app.exec())
运行效果
一个空白的测试模板
代码解读
大部分的情况和上面第一种是一样的。然后需要注意的是
-
class MyWidget(QtWidgets.QWidget)
这种方式是说定义一个新的类,这个类继承自QtWidgets.QWidget 这样做的方式是可以在这个新的类中加入一些新的界面元素和业务逻辑。
-
super().__init__(*args, **kwargs)
的意思是按照父类实现的__init__方式先对控件进行初始化。
一般情况下调用__init__()时,如果未传入父控件,则成为窗口(独立控件),反之则是父控件下的子控件。如QtWidgets.QWidget(self)
-
- 通过
self.setWindowTitle("空白测试模板") 、self.resize(800, 600)
分别设置UI的展示内容和窗口大小
- 通过
2. 控件常见的操作方法
2.1 创建窗口
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()# self创建时未传入父控件,故成为窗口
2.2 控件对象操作
.setParent() 指定本控件的父控件
.parentWidget() 获取父控件
.children() 获取所有子控件,返回一个列表
.childAt() 获取在指定坐标的子控件
.childrenRect() 所有子控件(被隐藏的除外)构成的矩形
.childrenRegion() 所有子控件(被隐藏的除外)构成的范围
2.3 进行布局
#创建布局管理器对象,创建时指定布局方向为垂直从上至下
layout = QtWidgets.QBoxLayout(QtWidgets.QBoxLayout.TopToBottom)
#将布局方向设置为水平从左至右
layout.setDirection(QtWidgets.QBoxLayout.LeftToRight)
#关键字
QBoxLayout.LeftToRight 水平从左至右
QBoxLayout.RightToLeft 水平从右至左
QBoxLayout.TopToBottom 垂直从上至下
QBoxLayout.BottomToTop 垂直从下至上
QBoxLayout有两个子类:QHBoxLayout与QVBoxLayout,行为与QBoxLayout几乎完全一样,只是指定了方向
2.4 设置Style
setStyleSheet 用于为单个控件设置个性化的样式表,而 setStyle 用于为整个应用程序设置全局的样式风格
-
setStyleSheet
button = QPushButton("Click me", self) button.setStyleSheet("background-color: #4CAF50; color: white; font-size: 20px;")
为控件设置基于 CSS 的样式表,可以实现更加灵活和个性化的外观定制。通过设置样式表,可以改变控件的背景颜色、文本颜色、边框样式、字体等外观特征。
-
setStyle
用于为应用程序设置全局的样式风格,即设置整个应用程序中所有控件的默认样式。通过设置全局样式,可以一次性地改变整个应用程序的外观。
相当于我先给某个风格取个名字,然后通过setStyle直接讲该控件设置为这个风格。
2.5 设置标题
self.setWindowTitle("QWidget简介") # 设置窗口标题
2.6 设置窗口大小
self.resize(800, 600) # 设置大小
2.7 最大最小尺寸
-
可拖拽修改
self.setMaximumSize(1000, 800) # 限制最大尺寸,用户拖拽窗口能达到的最大大小 self.setMaximumWidth(1000) # 亦可分别单独设置最大宽高 self.setMaximumHeight(800) self.resize(1500, 1000) # 即使再通过resize设置更大的尺寸,也无效
-
不可拖拽修改
self.setFixedSize(500, 500) # 设置为固定尺寸,用户不再可拖拽改变窗口尺寸 self.setFixedWidth(500) # 也可以分别单独设置固定的宽高 self.setFixedHeight(500)
2.8 自动调整尺寸
label.adjustSize() # label的大小会根据其内容进行调整
self.adjustSize() # self的大小根据其子控件大小进行调整
2.9 进行位置移动
red.move(300, 100)
2.10 同时设置位置与尺寸
self.setGeometry(200, 200, 600, 400) # 可以同时设置其位置与尺寸,计算像素时不包含框架
2.11 获取位置信息
print(self.x())
print(self.y())
print(self.pos())
print(self.label.pos()) # 显示的是相对于父控件的位置
print(self.geometry()) # 位置、大小
2.12 设置边距
#设置背景颜色,便于观察label控件的实际大小
label.setStyleSheet("background-color: cyan; font-size: 30px;")
#设置内容边距,距离左上角100 200像素
label.setContentsMargins(100, 200, 0, 0)
#获取边距
print(label.contentsMargins())
print(label.contentsRect())
2.13 设置是否可见
.setVisible() 设置可见/不可见
.isVisible() 获取可见状态
.hide() 设为不可见,等同于.setVisible(False)
.show() 对于非窗口的控件,等同于.setVisible(True)
2.14 设置是否可用
.setEnabled() 设置可用/不可用
.isEnabled() 获取可用状态
2.15 层级关系
#以下三种方法之一,都可以使得label_1显示在前面
self.label_2.lower() # 降低label_2的层级
self.label_1.raise_() # 提高label_1的层级
self.label_2.stackUnder(self.label_1) # 使得2在1之下
3. 其它
-
Python中包含组件和模块的概念吗?如何构造组件和模块呢?
-
模块
python一个模块一般就是一个.py
文件 -
包(组件)
包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python 的应用环境。简单来说,包就是文件夹,但该文件夹下必须存在
__init__.py
文件, 该文件的内容可以为空。__init__.py
用于标识当前文件夹是一个包。
类似于:test.py package_runoob |-- __init__.py |-- runoob1.py |-- runoob2.py 其中runoob1(其中实现了a函数)和runoob2(其中实现了b函数)被引用的方式为 from package_runoob.runoob1 import a from package_runoob.runoob2 import b
-
-
python中的pprintf()是什么功能
pprintf()是以一种漂亮的方式,打印数据结构中的内容(一般打印的是字典和列表)