16. 进度条控件

一、进度条控件

  进度条控件控件主要显示任务的执行进度,PySide6 中提供了进度条控件(QProgressBar)。进度条控件通常在执行长时间任务时,用进度条告诉用户当前的进展情况。

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

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

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

  用 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) 方法可以 设置进度条的方向,参数 orientationQt.Orientation 类型的枚举值,可以取值如下:

Qt.Orientation.Horizontal
Qt.Orientation.Vertical

  用 setTextDirection(direction:QProgressBar.Direction)方法 设置进度条上文本的方向,参数 directionQProgressBar.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,那么进度条会显示为一个不断循环滚动的繁忙状态;

posted @ 2025-01-04 21:45  星光映梦  阅读(183)  评论(0)    收藏  举报