16. 进度条控件
一、进度条控件
进度条控件控件主要显示任务的执行进度,PySide6 中提供了进度条控件(QProgressBar
)。进度条控件通常在执行长时间任务时,用进度条告诉用户当前的进展情况。
我们可以在终端中使用 pip
安装 PySide6 模块。默认是从国外的主站上下载,因此,我们可能会遇到网络不好的情况导致下载失败。我们可以在 pip
指令后通过 -i
指定国内镜像源下载。
pip install pyside6 -i https://mirrors.aliyun.com/pypi/simple
国内常用的 pip
下载源列表:
- 阿里云 https://mirrors.aliyun.com/pypi/simple
- 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple
- 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple
- 中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple
用 QProgressBar
类创建实例对象的方法如下:
QProgressBar(parent:QWidget=None)
其中,parent
是 窗口 或者 容器 类控件。
QProgressBar
类的常用方法及其说明如下:
# 实例方法
minimum() -> int # 获取最小值
maximum() -> int # 获取最大值
value() -> int # 获取值
text() -> str # 获取文本
orientation() -> Qt.Orientation # 获取方向
setAlignment(alignment:Qt.Alignment) -> None # 设置对齐方式
alignment() -> Qt.Alignment # 获取对齐方式
setFormat(format:str) -> None # 设置文本的格式
format() -> str # 获取文本的格式
resetFormat() -> None # 重置文本的格式
setInvertedAppearance(invert:bool) -> None # 设置外观是否反转
invertedAppearance() -> bool # 获取外观是否反转
setTextDirection(textDirection:Qt.TextDirection) -> None # 设置进度条文本方向
textDirection() -> Qt.TextDirection # 获取进度条文本方向
setTextVisible(visible:bool) -> None # 设置进度条文本是否可见
isTextVisible() -> bool # 获取进度条文本是否可见
# 槽函数
setMinimum(minimum:int) -> None # 设置最小值
setMaximum(maximum:int) -> None # 设置最大值
setRange(minimum:int, maximum:int) -> None # 设置范围
setValue(value:int) -> None # 设置值
setOrientation(orientation:Qt.Orientation) -> None # 设置方向
reset() -> None # 重置进度条,返回初始位置
QProgressBar
控件中常用的信号及其说明如下:
valueChanged(value:int) # 进度条的值发生改变时发射
用 setOrientation(orientation:Qt.Orientation)
方法可以 设置进度条的方向,参数 orientation
是 Qt.Orientation
类型的枚举值,可以取值如下:
Qt.Orientation.Horizontal
Qt.Orientation.Vertical
用 setTextDirection(direction:QProgressBar.Direction)
方法 设置进度条上文本的方向,参数 direction
是 QProgressBar.Direction
类型的枚举值,可以取值如下:
QProgressBar.Direction.TopToBottom # 文本顺时针旋转 90°
QProgressBar.Direction.BottomToTop # 文本逆时针旋转 90°
设置文本在进度条上的对齐方式 可以用 setAlignment(alignment:Qt.Alignment)
方法,如果我们将 Qt.Alignmen
枚举值设置为 Qt.AlignmentFlag.AlignCenter
,则 文本将会放置到进度条中部。
用 setFormat(format:str)
方法 设置显示的文字格式,在文字中 %p%
表示 百分比值,%v
表示 当前值,%m
表示 总数,默认显示的是 %p%
;获取文本格式 用 format()
方法;获取格式化的文本 用 text()
方法。
我们新建一个 ui.py 文件,用来存放 UI 相关的代码。
from PySide6.QtWidgets import QWidget
from PySide6.QtWidgets import QLabel, QProgressBar, QPushButton, QRadioButton
from PySide6.QtWidgets import QVBoxLayout
from PySide6.QtCore import Qt
class MyUi:
def setupUi(self, window:QWidget):
window.resize(300, 60) # 1.设置窗口对象大小
self.progressBar = QProgressBar(window) # 2.创建进度条控件
self.label = QLabel(window) # 3.创建标签控件
layout = QVBoxLayout(window) # 4.创建垂直布局
layout.addWidget(self.progressBar) # 5.添加控件到布局中
layout.addWidget(self.label)
# 进度条控件默认最小值为0,最大值为100,默认值为-1,水平方向
self.progressBar.setRange(0, 128) # 6.设置进度条范围
self.progressBar.setValue(0) # 7.设置进度条的当前值
self.progressBar.setFormat("%v/%m") # 8.设置进度条的文字显示格式
self.progressBar.setAlignment(Qt.AlignmentFlag.AlignCenter) # 9.设置文本对齐方式
# 10.获取进度条的最小值,最大值,当前值
text = f"min: {self.progressBar.minimum()}, max: {self.progressBar.maximum()}, value: {self.progressBar.value()}"
self.label.setText(text)
我们新建一个 widget.py 文件,用来存放业务逻辑相关的代码。
import sys
from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtCore import QTimer
from ui import MyUi
class MyWidget(QWidget):
def __init__(self):
super().__init__() # 1.调用父类Qwidget类的__init__()方法
self.__ui = MyUi()
self.__ui.setupUi(self) # 2.初始化页面
self.timer = QTimer(self) # 3.创建定时器
self.timer.start(100) # 4.启动定时器,并设置定时器间隔
self.timer.timeout.connect(self.update_progress) # 5.关联定时器定时时间到触发信号
self.__ui.progressBar.valueChanged.connect(self.update_label) # 6.关联进度条控件值改变时触发信号
def update_progress(self):
# 1.获取进度条的当前值、最大值和最小值计
value = self.__ui.progressBar.value() # 1.获取进度条的当前值
min_value = self.__ui.progressBar.minimum() # 3.获取进度条的最小值
max_value = self.__ui.progressBar.maximum() # 2.获取进度条的最大值
value = (value + 1) % (max_value + 1) + min_value
self.__ui.progressBar.setValue(value) # 4.设置进度条的当前值
if value >= (max_value + 1):
self.timer.stop() # 5.停止定时器
def update_label(self):
value = self.__ui.progressBar.value() # 1.获取进度条的当前值
min_value = self.__ui.progressBar.minimum() # 3.获取进度条的最小值
max_value = self.__ui.progressBar.maximum() # 2.获取进度条的最大值
value = (value - min_value) * 100 // (max_value - min_value)
self.__ui.label.setText(f"当前进度:{value} %") # 4.设置标签的文本
if __name__ == "__main__":
app = QApplication(sys.argv) # 1.创建一个QApplication类的实例
window = MyWidget() # 2.创建一个窗口
window.show() # 3.显示窗口
sys.exit(app.exec()) # 4.进入程序的主循环,并通过exit函数确保主循环安全结束
如果最小值和最大值都设置为 0,那么进度条会显示为一个不断循环滚动的繁忙状态;