开篇介绍:
hello 大家,本篇博客我们来学习QProgressBar常见属性
在 Qt 界面开发中,我们经常会遇到一些 "耗时任务"------ 比如下载一个大文件、加载大量数据、安装一个软件、导出一份报表。在这些场景下,用户最需要的是什么?是反馈------ 他们需要知道 "任务进行到哪了""还要多久才能完成",而不是面对一个毫无反应的界面干着急。
为了满足这个需求,Qt 专门为我们提供了一个核心控件:QProgressBar(进度条控件)。QProgressBar 是界面中反馈任务进度的关键组件,它可以用可视化的色块展示任务完成度,还可以配合文本显示百分比、当前值,让用户对任务进度一目了然。
很多新手刚接触 QProgressBar 时,会觉得它很简单 ------ 不就是设个最小值、最大值,再设个当前值吗?但用起来才发现,它还有很多实用的属性:比如可以让进度条垂直显示、反向增长、自定义文本格式、隐藏文本、甚至在未知进度时显示 "繁忙模式"(色块来回滚动)。更重要的是,千万不要把类名拼错! 是 QProgressBar(Progress = 进度),不是 QProcessBar(Process = 进程)------ 这个拼写错误新手几乎都会犯,一定要牢记!
别担心!这篇文章我会结合 QProgressBar 的所有核心属性(minimum、maximum、value、orientation、invertAppearance、textVisible、alignment、textDirection、format)进行解析
我们还会讲如何用样式表自定义进度条颜色,以及如何结合 QTimer 实现一个定时增长的进度条。
话不多说,我们正式开始!
第一章 先搞懂基础:QProgressBar 的定位与拼写警告
在讲具体属性之前,我们必须先搞懂两个最基础、最重要的问题:QProgressBar 是用来做什么的?以及,它的类名怎么拼才对?
1.1 QProgressBar 的核心定位
QProgressBar 是 Qt 中用于可视化展示任务进度的核心控件,主要用于展示耗时任务的完成进度(如文件下载、数据加载、安装流程、文件导出等)。
通俗理解:QLabel 是 "告示牌",用来显示文字;QLCDNumber 是 "液晶计算器屏幕",用来显示数字;而 QProgressBar 就是 "进度指示器"------ 它用一个 "填充色块" 的方式,直观地告诉你 "任务完成了多少",比如填充了一半,就是完成了 50%;填充完了,就是任务完成了。

QProgressBar 支持很多自定义功能:你可以自定义进度范围(比如 0-100,或者 0-500)、可以让进度条水平或垂直显示、可以让进度反向增长、可以自定义上面的文本格式(显示百分比、当前值)、可以隐藏文本、甚至在不知道任务还要多久完成时,让进度条进入 "繁忙模式"(色块来回滚动,告诉用户 "我在干活,只是不知道还要多久")。
1.2 重要!重要!重要!拼写警告
这里有一个新手几乎 100% 会踩的坑,必须放在最前面、用最大的字号提醒你:
类名是
QProgressBar,不是QProcessBar! Progress(进度),不是 Process(进程)!
为什么会拼错?因为 "Process(进程)" 这个词我们见得太多了,而 "Progress(进度)" 稍微少一点,所以手一滑就写成了 QProcessBar------ 但 Qt 里根本没有 QProcessBar 这个类,只有 QProgressBar 和 QProcess(后者是用来启动外部进程的,和进度条完全没关系)。
如果你写成了 QProcessBar,编译时会报错说 "'QProcessBar': 未声明的标识符",这时候一定要检查拼写 ------ 把 Process 改成 Progress 就好了。这个错误虽然低级,但真的太常见了,一定要牢记!
第二章 QProgressBar 核心属性详解(上):范围与值属性(minimum、maximum、value)
QProgressBar 的核心功能是展示 "进度",而 "进度" 首先得有一个 "范围" 和一个 "当前值"------ 比如 "从 0 到 100,当前是 50",就是完成了 50%。Qt 为 QProgressBar 提供了三个核心属性来控制范围和值:minimum(最小值)、maximum(最大值)、value(当前值)。这三个属性是 QProgressBar 最基础、最常用的属性,我们先从它们讲起。
2.1 属性一:minimum(最小值)------ 进度范围的起点
2.1.1 属性的核心定义
minimum 属性用于定义 QProgressBar 进度范围的下限值,也就是进度的 "起点",默认值为 0。
通俗理解:minimum 就像 "跑步的起跑线"------ 你从 0 米开始跑,0 就是最小值;如果你从 10 米开始跑,10 就是最小值。
这里有一个非常重要的规则:最小值必须小于等于最大值 ------ 如果你不小心手动设置了最小值大于最大值(比如 setMinimum(100),setMaximum(0)),Qt 不会报错,而是会自动交换二者 ,确保范围合法(变成 minimum=0,maximum=100)。
另外,minimum 还是计算进度百分比(%p)的核心基准之一 ------ 百分比的计算公式是:
百分比 = (当前值 - 最小值) / (最大值 - 最小值) × 100(当最大值 ≠ 最小值时)
比如最小值是 0,最大值是 100,当前值是 50,百分比就是 (50-0)/(100-0)×100 = 50%;如果最小值是 10,最大值是 110,当前值是 60,百分比也是 (60-10)/(110-10)×100 = 50%------ 所以百分比只和 "相对位置" 有关,和 "绝对数值" 无关。
2.1.2 数据类型
int 类型,整数(常规场景建议设为非负数,无强制限制),默认值为 0。
2.1.3 关联 API 详解(逐词逐句,零模糊)
1. 获取当前最小值:int minimum () const
函数原型:
int QProgressBar::minimum() const;
逐词逐句底层解析:
int:返回值类型,返回当前设置的进度条最小值;QProgressBar:::说明这个函数是QProgressBar类的成员函数,只能用 QProgressBar 对象调用;minimum():函数名,很直观,就是 "获取最小值" 的意思;const:说明这个函数是常成员函数 ------ 它只会读取 QProgressBar 的最小值,不会修改任何状态,所以你可以在const的成员函数里调用它。
返回值说明:
- 返回
int类型的整数,默认返回 0(未设置时)。
调用示例:
// 获取当前设置的最小值
int minVal = ui->progressBar->minimum();
// 打印出来验证
qDebug() << "当前进度条最小值:" << minVal;
2. 设置最小值:void setMinimum (int min)
函数原型:
void QProgressBar::setMinimum(int min);
逐词逐句底层解析:
void:函数没有返回值,只是执行 "设置最小值" 的操作;QProgressBar:::成员函数;setMinimum():函数名,"设置最小值" 的意思;int min:入参,min是要设置的最小值(整数)。
参数说明:
min:要设置的最小值,int类型;- 常规场景建议设为 0(默认值),符合大多数人的习惯;
- 如果你设置的
min大于当前的maximum,Qt 会自动交换二者,确保范围合法。
生效规则:
- 调用后立即生效;
- 修改最小值后,当前的
value(当前值)会自动适配新范围(比如原范围 0-100、value=50,改为 10-110 后,value 仍为 50,对应 40%)。
调用示例:
// 示例1:设置最小值为 0(默认值,常规场景)
ui->progressBar->setMinimum(0);
// 示例2:自定义最小值为 10(需配合 maximum > 10)
ui->progressBar->setMinimum(10);
ui->progressBar->setMaximum(110); // 最大值设为 110,确保范围合法
2.2 属性二:maximum(最大值)------ 进度范围的终点(含繁忙模式详解)
2.2.1 属性的核心定义
maximum 属性用于定义 QProgressBar 进度范围的上限值,也就是进度的 "终点",默认值为 100。
通俗理解:maximum 就像 "跑步的终点线"------ 你要跑到 100 米,100 就是最大值;你要跑到 500 米,500 就是最大值。
这里有一个非常重要、非常实用的特殊规则,必须单独拿出来讲:
如果将最大值设为 0,进度条会进入「繁忙模式」(Indeterminate Mode)!
什么是 "繁忙模式"?通俗理解就是 ------"我不知道任务还要多久完成,但我确实在干活"。在繁忙模式下,进度条不会显示具体的进度值,而是有一个色块在进度条里来回滚动,告诉用户 "程序没卡死,正在处理中,请耐心等待"。
繁忙模式的适用场景非常多:比如网络请求(不知道服务器多久响应)、文件扫描(不知道文件数量多少)、复杂计算(不知道计算量多大)------ 只要是 "未知耗时" 的任务,都可以用繁忙模式。
除了繁忙模式,正常模式下(maximum > minimum),需保证最大值 ≥ 最小值,否则 Qt 会自动交换二者。
2.2.2 数据类型
int 类型,整数,默认值为 100;设为 0 进入繁忙模式。
2.2.3 关联 API 详解(逐词逐句,零模糊)
1. 获取当前最大值:int maximum () const
函数原型:
int QProgressBar::maximum() const;
逐词逐句底层解析:
int:返回值类型,返回当前设置的进度条最大值;QProgressBar:::成员函数;maximum():函数名,"获取最大值" 的意思;const:常成员函数。
返回值说明:
- 返回
int类型的整数,默认返回 100(未设置时); - 返回 0 表示当前是繁忙模式。
调用示例:
// 获取当前设置的最大值
int maxVal = ui->progressBar->maximum();
if (maxVal == 0) {
qDebug() << "当前是繁忙模式";
} else {
qDebug() << "当前进度条最大值:" << maxVal;
}
2. 设置最大值:void setMaximum (int max)
函数原型:
void QProgressBar::setMaximum(int max);
逐词逐句底层解析:
void:无返回值;QProgressBar:::成员函数;setMaximum():函数名,"设置最大值" 的意思;int max:入参,max是要设置的最大值(整数)。
参数说明:
max:要设置的最大值,int类型;- 设为 0 进入繁忙模式(未知进度,色块滚动);
- 设为 > minimum 的值进入正常模式(已知进度,显示具体值);
- 如果你设置的
max小于当前的minimum,Qt 会自动交换二者。
生效规则:
- 调用后立即生效;
- 从正常模式切换到繁忙模式:
value属性失效(设置无效果),进度条开始滚动; - 从繁忙模式切换到正常模式:
value属性恢复生效,进度条显示具体值。
调用示例:
// 示例1:正常模式:进度范围 0-100(百分比进度,最常用)
ui->progressBar->setMinimum(0);
ui->progressBar->setMaximum(100);
// 示例2:繁忙模式:未知进度,进度条滚动
ui->progressBar->setMaximum(0); // 开启繁忙模式
ui->progressBar->setTextVisible(false); // 繁忙模式下通常隐藏文本
// 示例3:自定义范围:0-500(适用于大任务量进度,比如文件总大小 500KB)
ui->progressBar->setMinimum(0);
ui->progressBar->setMaximum(500);
2.3 属性三:value(当前值)------ 进度条的核心,更新进度就靠它
2.3.1 属性的核心定义
value 属性表示 QProgressBar 当前的进度位置,是更新进度的核心属性------ 我们要让进度条往前走,就是靠修改这个属性。
value 的取值范围严格限制在 [minimum, maximum] 之间:
- 如果你设置的值小于
minimum,Qt 会自动把它截断为minimum; - 如果你设置的值大于
maximum,Qt 会自动把它截断为maximum; - 当
value等于maximum时,代表任务 100% 完成。
这里有几个非常重要的规则,必须牢记:
- 繁忙模式下失效 :如果
maximum=0(繁忙模式),setValue()没有任何效果 ------ 进度条只会滚动,不会显示具体值; - 自动截断:超出范围的值会被自动截断,不会报错;
- 百分比计算 :百分比基于
(value - minimum)/(maximum - minimum) × 100计算,和maximum是否为 100 无关。
2.3.2 数据类型
int 类型,整数,默认值为 0。
2.3.3 关联 API 详解(逐词逐句,零模糊)
1. 获取当前进度值:int value () const
函数原型:
int QProgressBar::value() const;
逐词逐句底层解析:
int:返回值类型,返回当前的进度值;QProgressBar:::成员函数;value():函数名,"获取当前值" 的意思;const:常成员函数。
返回值说明:
- 返回
int类型的整数,默认返回 0(未设置时); - 繁忙模式下返回 0(但无实际意义)。
调用示例:
// 获取当前进度值
int currentVal = ui->progressBar->value();
// 打印出来验证
qDebug() << "当前进度值:" << currentVal;
2. 设置当前进度值:void setValue (int val)
函数原型:
void QProgressBar::setValue(int val);
逐词逐句底层解析:
void:无返回值;QProgressBar:::成员函数;setValue():函数名,"设置当前值" 的意思 ------这是更新进度的核心方法!int val:入参,val是要设置的当前进度值(整数)。
参数说明:
val:要设置的当前进度值,int类型;- 超出
[minimum, maximum]范围的值会被自动截断(小于minimum取minimum,大于maximum取maximum); - 繁忙模式下(
maximum=0),调用此函数无任何效果。
生效规则:
- 调用后立即生效,进度条的色块会立即更新到对应位置;
- 如果
textVisible为true,文本也会立即更新。
调用示例:
// 先设置常规进度范围
ui->progressBar->setMinimum(0);
ui->progressBar->setMaximum(100);
// 示例1:设置当前进度为 50(对应 50%)
ui->progressBar->setValue(50);
// 示例2:超出最大值,自动截断为 100
ui->progressBar->setValue(120); // 实际 value 为 100
// 示例3:低于最小值,自动截断为 0
ui->progressBar->setValue(-10); // 实际 value 为 0
2.3.4 典型代码示例(两个实用场景,一看就懂)
示例一:验证范围与自动截断规则
这个场景可以直观地看到范围设置和自动截断的效果:
#include "widget.h"
#include "ui_widget.h"
#include <QProgressBar>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QProgressBar *progressBar = new QProgressBar(this);
progressBar->setGeometry(100, 100, 400, 30);
progressBar->setTextVisible(true);
progressBar->setFormat("%p%"); // 显示百分比
// 1. 常规范围:0-100
progressBar->setMinimum(0);
progressBar->setMaximum(100);
progressBar->setValue(50);
qDebug() << "=== 范围 0-100,setValue(50) ===";
qDebug() << "value:" << progressBar->value(); // 输出 50
qDebug() << "百分比:" << (progressBar->value() - progressBar->minimum()) * 100 / (progressBar->maximum() - progressBar->minimum()) << "%"; // 输出 50%
// 2. 测试超出最大值:自动截断
progressBar->setValue(120);
qDebug() << "=== setValue(120)(超出最大值)===";
qDebug() << "value:" << progressBar->value(); // 输出 100(自动截断)
// 3. 测试低于最小值:自动截断
progressBar->setValue(-10);
qDebug() << "=== setValue(-10)(低于最小值)===";
qDebug() << "value:" << progressBar->value(); // 输出 0(自动截断)
// 4. 测试繁忙模式:setValue 失效
progressBar->setMaximum(0); // 切换到繁忙模式
progressBar->setValue(50); // 繁忙模式下调用 setValue 无效果
qDebug() << "=== 切换到繁忙模式,setValue(50) ===";
qDebug() << "value:" << progressBar->value(); // 输出 0(无实际意义,进度条仅滚动)
}
Widget::~Widget()
{
delete ui;
}
示例二:文件下载进度模拟(自定义范围)
这个场景模拟了文件下载进度,总大小 1024KB,当前下载 512KB:
#include "widget.h"
#include "ui_widget.h"
#include <QProgressBar>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QProgressBar *progressBar = new QProgressBar(this);
progressBar->setGeometry(100, 100, 400, 30);
progressBar->setTextVisible(true);
// 场景:文件下载,总大小 1024KB,当前下载 512KB
progressBar->setMinimum(0); // 起始值 0(未开始下载)
progressBar->setMaximum(1024); // 总大小 1024KB
progressBar->setValue(512); // 当前下载 512KB
// 自定义文本格式:显示"已下载 512/1024 KB"
progressBar->setFormat("已下载 %v/1024 KB");
// 手动计算百分比验证
int percentage = (progressBar->value() - progressBar->minimum()) * 100 / (progressBar->maximum() - progressBar->minimum());
qDebug() << "当前下载进度:" << percentage << "%"; // 输出 50%
}
Widget::~Widget()
{
delete ui;
}
三属性示例代码:
cpp
#include "widget.h"
#include "ui_widget.h"
#include <QProgressBar>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//OK,那么本文件我们就来学习QProgressBar的minimum属性、maxmum属性、value属性
//那么起那两个是很简单的,就是定义进度条可显示的进度下限值以及上限值
//真正重要的是value属性,该属性表示进度条当前的进度位置,取值严格限制在 [minimum, maximum] 区间内;
//我们要更新进度条的进度就是通过修改该value属性的哦~~~
//这个要注意
/**
* @property QProgressBar::minimum
* @brief QProgressBar进度范围的最小值属性
* @details 该属性定义进度条可显示的进度下限值,是进度范围的起始点,默认值为0;
* 设置时需保证最小值 ≤ 最大值(若手动设置最小值大于最大值,Qt会自动交换二者,确保范围合法);
* 该属性是计算进度百分比(%p)的核心基准之一(百分比 = (value - minimum)/(maximum - minimum) × 100)。
*
* 【关联API详解】
* 1. int minimum() const
* - 功能:获取当前设置的进度条最小值
* - 返回值:int类型,默认返回0
* - 调用示例:
* int minVal = ui->progressBar->minimum(); // 读取最小值
*
* 2. void setMinimum(int min)
* - 功能:设置进度条最小值
* - 参数:min - 整数(常规场景建议设为非负数,无强制限制)
* - 示例:
* ui->progressBar->setMinimum(0); // 常规进度范围起始(默认)
* ui->progressBar->setMinimum(10); // 自定义起始值(需配合maximum>10)
*
* ===================================== 属性2:maximum =====================================
* @property QProgressBar::maximum
* @brief QProgressBar进度范围的最大值属性
* @details 该属性定义进度条可显示的进度上限值,是进度范围的终点,默认值为100;
* 核心特殊规则:若将最大值设为0,进度条会进入**繁忙模式**(Indeterminate Mode)------ 无具体进度值,进度色块来回滚动,适用于未知耗时的任务(如网络加载、文件扫描);
* 正常模式下需保证最大值 ≥ 最小值,否则Qt自动交换二者。
*
* 【关联API详解】
* 1. int maximum() const
* - 功能:获取当前设置的进度条最大值
* - 返回值:int类型,默认返回100
* - 调用示例:
* int maxVal = ui->progressBar->maximum(); // 读取最大值
*
* 2. void setMaximum(int max)
* - 功能:设置进度条最大值,控制进度范围/模式
* - 参数:max - 整数(设为0进入繁忙模式,>minimum为正常模式)
* - 示例:
* // 正常模式:进度范围0-100(百分比进度)
* ui->progressBar->setMaximum(100);
* // 繁忙模式:未知进度,进度条滚动
* ui->progressBar->setMaximum(0);
* // 自定义范围:0-500(适用于大任务量进度)
* ui->progressBar->setMaximum(500);
*
* ===================================== 属性3:value =====================================
* @property QProgressBar::value
* @brief QProgressBar的当前进度值属性
* @details 该属性表示进度条当前的进度位置,取值严格限制在 [minimum, maximum] 区间内;
* 若设置的值超出该区间,Qt会自动截断(小于minimum取minimum,大于maximum取maximum);
* 繁忙模式下(maximum=0),该属性失效(设置无效果,进度条无固定值);
* 当value等于maximum时,代表任务100%完成。
*
* 【关联API详解】
* 1. int value() const
* - 功能:获取当前进度值
* - 返回值:int类型,默认返回0
* - 调用示例:
* int currentVal = ui->progressBar->value(); // 读取当前进度
*
* 2. void setValue(int val)
* - 功能:设置当前进度值,是更新进度的核心方法
* - 参数:val - 整数,超出[minimum, maximum]会被自动截断
* - 示例:
* // 先设置常规进度范围
* ui->progressBar->setMinimum(0);
* ui->progressBar->setMaximum(100);
* // 设置当前进度为50(对应50%)
* ui->progressBar->setValue(50);
* // 超出最大值,自动截断为100
* ui->progressBar->setValue(120);
* // 低于最小值,自动截断为0
* ui->progressBar->setValue(-10);
*
* 【核心关联规则(必知)】
* 1. 进度百分比计算:%p = (value - minimum) / (maximum - minimum) × 100(maximum≠minimum);
* 2. 繁忙模式:maximum=0时,setValue()无任何效果,进度条仅滚动不显示具体值;
* 3. 范围修改:修改minimum/maximum后,当前value会自动适配新范围(如原0-100、value=50,改为0-200后value仍为50,对应25%)。
*
* 【典型组合示例】
* // 场景:文件下载进度(总大小1024KB,当前下载512KB)
* ui->progressBar->setMinimum(0); // 起始值0
* ui->progressBar->setMaximum(1024); // 总大小1024KB
* ui->progressBar->setValue(512); // 当前下载512KB(对应50%)
* qDebug() << "当前进度百分比:" << (ui->progressBar->value() - ui->progressBar->minimum()) * 100 / (ui->progressBar->maximum() - ui->progressBar->minimum()) << "%";
*/
QProgressBar* progressbar=new QProgressBar(this);
progressbar->setMaximum(100);
progressbar->setMinimum(0);
progressbar->setValue(50);
}
Widget::~Widget()
{
delete ui;
}
第三章 QProgressBar 核心属性详解(中):视觉布局属性(orientation、invertAppearance)
讲完了范围和值属性,我们再讲两个控制进度条视觉布局 的属性:orientation(显示方向)和 invertAppearance(反向增长)。这两个属性可以让进度条水平或垂直显示,还可以让进度反向增长(比如从右到左、从上到下),非常灵活。
3.1 属性四:orientation(显示方向)------ 水平还是垂直?
3.1.1 属性的核心定义
orientation 属性用于控制 QProgressBar 的整体展示方向是水平 还是垂直 ,默认值为 Qt::Horizontal(水平)。
通俗理解:orientation 就像 "进度条的摆放方向"------ 你可以把它横着放(水平),也可以把它竖着放(垂直)。
这里有几个点需要注意:
- 方向仅改变视觉布局 :不影响
value、minimum、maximum的数值计算 ------ 不管是水平还是垂直,50% 就是 50%; - 垂直进度条需调整高度 :垂直进度条如果高度太小,视觉效果不明显,建议用
setFixedHeight()设置足够的高度; - 联动 invertAppearance :方向切换后,
invertAppearance(反向增长)的逻辑会自动适配新方向 ------ 我们后面会讲。
3.1.2 数据类型
Qt::Orientation 枚举类型,包含两个常用值:
Qt::Horizontal:水平方向(默认);Qt::Vertical:垂直方向。
3.1.3 关联 API 详解(逐词逐句,零模糊)
1. 获取当前显示方向:Qt::Orientation orientation () const
函数原型:
Qt::Orientation QProgressBar::orientation() const;
逐词逐句底层解析:
Qt::Orientation:返回值类型,返回当前的显示方向;QProgressBar:::成员函数;orientation():函数名,"获取显示方向" 的意思;const:常成员函数。
返回值说明:
- 返回
Qt::Horizontal(水平)或Qt::Vertical(垂直); - 默认返回
Qt::Horizontal。
调用示例:
Qt::Orientation orient = ui->progressBar->orientation();
if (orient == Qt::Horizontal) {
qDebug() << "当前是水平进度条";
} else {
qDebug() << "当前是垂直进度条";
}
2. 设置显示方向:void setOrientation (Qt::Orientation orient)
函数原型:
void QProgressBar::setOrientation(Qt::Orientation orient);
逐词逐句底层解析:
void:无返回值;QProgressBar:::成员函数;setOrientation():函数名,"设置显示方向" 的意思;Qt::Orientation orient:入参,orient是方向枚举值(Horizontal/Vertical)。
参数说明:
orient:Qt::Horizontal(水平)或Qt::Vertical(垂直);- 垂直进度条建议配合
setFixedHeight()设置足够的高度,否则视觉效果不明显。
生效规则:
- 调用后立即生效,进度条的布局会立即切换;
invertAppearance的反向增长逻辑会自动适配新方向。
调用示例:
// 示例1:水平进度条(默认,最常用)
ui->progressBar->setOrientation(Qt::Horizontal);
// 示例2:垂直进度条(需设置足够的高度)
ui->progressBar->setOrientation(Qt::Vertical);
ui->progressBar->setFixedHeight(200); // 设置垂直进度条高度为 200 像素
3.2 属性五:invertAppearance(反向增长)------ 从左到右还是从右到左?
3.2.1 属性的核心定义
invertAppearance 属性用于控制 QProgressBar 的色块填充方向是否反向 ,默认值为 false(正向增长)。
通俗理解:invertAppearance 就像 "进度条的填充方向开关"------ 如果关闭(false,正向),水平进度条从左到右填充,垂直进度条从下到上填充;如果开启(true,反向),水平进度条从右到左填充,垂直进度条从上到下填充。
这里有一个非常重要的点:反向增长仅改变视觉填充方向,不影响数值计算 ------ 不管是从左到右还是从右到左,value=50 就是 50%,百分比计算完全不受影响。
3.2.2 不同方向下的增长规则(核心,必知)
为了让你更清楚地理解正向和反向的效果,我做了一个对比表格:
表格
| 进度条方向 | 正向增长(invertAppearance=false) | 反向增长(invertAppearance=true) |
|---|---|---|
| 水平(Horizontal) | 进度色块从左向右填充(默认) | 进度色块从右向左填充 |
| 垂直(Vertical) | 进度色块从下向上填充(默认) | 进度色块从上向下填充 |
这个规则一定要牢记 ------ 水平和垂直的正向 / 反向是不一样的,垂直正向是从下到上,不是从上到下!
3.2.3 数据类型
bool 类型,false 表示正向增长(默认),true 表示反向增长。
3.2.4 关联 API 详解(逐词逐句,零模糊)
1. 获取是否开启反向增长:bool invertAppearance () const
函数原型:
bool QProgressBar::invertAppearance() const;
逐词逐句底层解析:
bool:返回值类型,返回是否开启反向增长;QProgressBar:::成员函数;invertAppearance():函数名,"获取是否反向增长" 的意思;const:常成员函数。
返回值说明:
false表示正向增长(默认),true表示反向增长。
调用示例:
bool isInvert = ui->progressBar->invertAppearance();
if (isInvert) {
qDebug() << "当前是反向增长";
} else {
qDebug() << "当前是正向增长";
}
2. 设置是否开启反向增长:void setInvertAppearance (bool invert)
函数原型:
void QProgressBar::setInvertAppearance(bool invert);
逐词逐句底层解析:
void:无返回值;QProgressBar:::成员函数;setInvertAppearance():函数名,"设置是否反向增长" 的意思;bool invert:入参,invert是true开启反向,false关闭反向。
参数说明:
invert:true开启反向增长,false关闭反向增长(默认);- 开启后,进度色块会立即切换填充方向,无需刷新。
生效规则:
- 调用后立即生效,当前进度色块会立即切换填充方向;
- 仅改变视觉效果,
value的数值大小和百分比计算不受任何影响; - 繁忙模式下(
maximum=0),反向属性会改变滚动色块的移动方向。
调用示例:
// 示例1:水平进度条反向增长(从右到左填充)
ui->progressBar->setOrientation(Qt::Horizontal);
ui->progressBar->setInvertAppearance(true);
ui->progressBar->setValue(50); // 右侧 50% 区域填充色块
// 示例2:垂直进度条反向增长(从上到下填充)
ui->progressBar->setOrientation(Qt::Vertical);
ui->progressBar->setFixedHeight(200);
ui->progressBar->setInvertAppearance(true);
ui->progressBar->setValue(50); // 上侧 50% 区域填充色块
两属性示例代码:
cpp
#include "widget.h"
#include "ui_widget.h"
#include <QProgressBar>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//OK,那么本文件我们来学习QProgressBar的orientation属性,invertAppearance属性、format属性
//前两个属性比较简单,orientation属性是控制进度条的方向是水平的还是垂直的
//Qt::Vertical垂直方向,Qt::Horizontal水平方向
//而invertAppearance属性是控制进度条是否是朝反方向增长进度
//最重要的format属性,我们就是要通过这个属性设置QProgressBar控件的文本显示,令其不是单单的数字
//还可以有汉字,包括还能设置数字的显示格式,就是使用占位符
//• %p :表示进度的百分比(0-100)
//• %v :表示进度的数值(0-100)
//• %m :表示剩余时间(以毫秒为单位)
//• %t :表示总时间(以毫秒为单位)
//它的使用方法也是很简单,就像printf一样使用就差不多, progressbar->setFormat("进度:%p");
//但是它获取数值,依旧是从QProgressBar的value属性获取哦~~~
/**
* @property QProgressBar::orientation
* @brief QProgressBar的显示方向属性
* @details 该属性控制进度条的整体展示方向是水平还是垂直,默认值为Qt::Horizontal(水平);
* 方向仅改变进度条的视觉布局,不影响进度值(value)的计算逻辑,垂直进度条的进度增长方向受invertAppearance属性联动控制。
*
* 【枚举值详解(Qt::Orientation)】
* | 枚举值 | 中文名称 | 功能说明 |
* |---------------------|------------|--------------------------------------------------------------------------|
* | Qt::Horizontal | 水平方向 | 进度条沿水平方向展示(默认),是最常用的展示形式,进度增长方向为左右向; |
* | Qt::Vertical | 垂直方向 | 进度条沿垂直方向展示,需调整控件高度以体现进度变化,进度增长方向为上下向; |
*
* 【关联API详解】
* 1. Qt::Orientation orientation() const
* - 功能:获取当前进度条的显示方向
* - 返回值:Qt::Orientation枚举值,默认返回Qt::Horizontal
* - 调用示例:
* Qt::Orientation orient = ui->progressBar->orientation();
*
* 2. void setOrientation(Qt::Orientation orient)
* - 功能:设置进度条的显示方向
* - 参数:orient - 方向枚举值(Horizontal/Vertical)
* - 示例:
* // 切换为垂直进度条(需调整控件高度才能直观看到效果)
* ui->progressBar->setOrientation(Qt::Vertical);
* ui->progressBar->setFixedHeight(200); // 设置垂直进度条高度
*
* 【关键注意事项】
* 1. 布局适配:垂直进度条需设置足够的高度(如setFixedHeight),否则视觉效果不明显;
* 2. 联动规则:方向切换后,invertAppearance的反向增长逻辑会自动适配新方向;
* 3. 文本适配:垂直进度条的文本朝向需通过textDirection属性调整,alignment仍控制水平对齐。
*
* ---
*
* @property QProgressBar::invertAppearance
* @brief QProgressBar的进度反向增长属性
* @details 该属性控制进度条的色块填充方向是否反向,默认值为false(正向增长);
* 仅改变进度的视觉增长方向,不影响value、minimum、maximum的数值计算,是纯视觉层面的调整。
*
* 【不同方向下的增长规则(核心)】
* | 进度条方向 | 正向增长(invertAppearance=false) | 反向增长(invertAppearance=true) |
* |------------------|------------------------------------|------------------------------------|
* | 水平(Horizontal)| 进度色块从左向右填充 | 进度色块从右向左填充 |
* | 垂直(Vertical) | 进度色块从下向上填充 | 进度色块从上向下填充 |
*
* 【关联API详解】
* 1. bool invertAppearance() const
* - 功能:获取是否开启进度反向增长
* - 返回值:false正向(默认),true反向
* - 调用示例:
* bool isInvert = ui->progressBar->invertAppearance();
*
* 2. void setInvertAppearance(bool invert)
* - 功能:设置进度增长方向是否反向
* - 参数:invert - true开启反向,false关闭
* - 示例:
* // 水平进度条反向增长(从右到左填充)
* ui->progressBar->setOrientation(Qt::Horizontal);
* ui->progressBar->setInvertAppearance(true);
* ui->progressBar->setValue(50); // 右侧50%区域填充色块
*
* 【关键注意事项】
* 1. 数值无关:反向增长仅改变视觉填充方向,value的数值大小和百分比计算不受任何影响;
* 2. 即时生效:设置后无需刷新进度条,当前进度色块会立即切换填充方向;
* 3. 繁忙模式适配:繁忙模式(maximum=0)下,反向属性会改变滚动色块的移动方向。
*
* ---
*
* @property QProgressBar::format
* @brief QProgressBar的进度文本格式属性
* @details 该属性用于自定义进度条显示的文本内容格式,支持占位符动态替换,默认值为"%p%"(显示百分比);
* 仅当textVisible为true时生效,若设置为空字符串(""),文本区域仍保留但内容为空,适用于自定义文本展示场景。
*
* 【占位符详解(核心)】
* | 占位符 | 中文含义 | 功能说明 |
* |--------|----------------|--------------------------------------------------------------------------|
* | %p | 进度百分比 | 显示0-100的百分比值(如value=50时显示"50",默认格式%p%会显示"50%"),最常用; |
* | %v | 进度当前数值 | 显示value的原始数值(如minimum=0、maximum=100时,value=50显示"50"); |
* | %m | 剩余时间(毫秒)| 需手动结合定时器/任务逻辑绑定数值,Qt无默认计算逻辑,默认显示空值; |
* | %t | 总时间(毫秒) | 需手动结合定时器/任务逻辑绑定数值,Qt无默认计算逻辑,默认显示空值; |
*
* 【关联API详解】
* 1. QString format() const
* - 功能:获取当前文本格式字符串
* - 返回值:QString类型,默认返回"%p%"
* - 调用示例:
* QString fmt = ui->progressBar->format();
*
* 2. void setFormat(const QString &format)
* - 功能:设置自定义文本格式
* - 参数:format - 包含占位符的格式字符串(支持普通文本+占位符组合)
* - 示例:
* // 默认格式:显示"50%"
* ui->progressBar->setFormat("%p%");
* // 自定义格式:显示"进度:50/100"
* ui->progressBar->setFormat("进度:%v/100");
* // 组合格式:显示"完成50%,剩余1000ms"(需手动绑定%m值)
* ui->progressBar->setFormat("完成%p%,剩余%m ms");
* // 清空格式:文本区域为空
* ui->progressBar->setFormat("");
*
* 【关键注意事项】
* 1. %m/%t使用:这两个占位符需手动通过代码计算并关联(如定时器统计耗时),Qt不会自动计算剩余/总时间;
* 2. 格式生效:修改format后,文本会立即刷新为新格式,无需重启进度条;
* 3. 百分比计算:%p的取值基于 (value - minimum)/(maximum - minimum) × 100,与maximum是否为100无关;
* 4. 文本长度:格式字符串过长可能导致文本超出进度条区域,需结合控件宽度适配。
*
* 【典型组合示例】
* // 需求:垂直反向进度条,显示"当前进度:80/200"格式文本
* ui->progressBar->setMinimum(0);
* ui->progressBar->setMaximum(200);
* ui->progressBar->setOrientation(Qt::Vertical); // 垂直方向
* ui->progressBar->setInvertAppearance(true); // 从上到下增长
* ui->progressBar->setTextVisible(true); // 显示文本
* ui->progressBar->setFormat("当前进度:%v/200"); // 自定义格式
* ui->progressBar->setValue(80); // 显示"当前进度:80/200",色块从上到下填充80/200区域
*/
QProgressBar* progressbar=new QProgressBar(this);
progressbar->setMaximum(100);
progressbar->setMinimum(0);
progressbar->setValue(50);
progressbar->setGeometry(200,200,500,200);
// * | 占位符 | 中文含义 | 功能说明 |
// * |--------|----------------|--------------------------------------------------------------------------|
// * | %p | 进度百分比 | 显示0-100的百分比值(如value=50时显示"50",默认格式%p%会显示"50%"),最常用; |
// * | %v | 进度当前数值 | 显示value的原始数值(如minimum=0、maximum=100时,value=50显示"50"); |
// * | %m | 剩余时间(毫秒)| 需手动结合定时器/任务逻辑绑定数值,Qt无默认计算逻辑,默认显示空值; |
// * | %t | 总时间(毫秒) | 需手动结合定时器/任务逻辑绑定数值,Qt无默认计算逻辑,默认显示空值; |
progressbar->setFormat("进度:%p");
progressbar->setFormat("进度:%v");
progressbar->setFormat("进度:%m");
progressbar->setFormat("进度:%t");
//那么其实我们还可以设置一个定时进度条,但是没什么必要了就是,以后用到再说,毕竟我们之前也使用过QTimer了~~~
}
Widget::~Widget()
{
delete ui;
}
第四章 QProgressBar 核心属性详解(下):文本显示属性(textVisible、alignment、textDirection、format)
除了色块,QProgressBar 还可以显示文本 ------ 比如百分比、当前值,让用户更直观地知道进度。Qt 为 QProgressBar 提供了四个文本相关的属性:textVisible(文本显隐)、alignment(文本对齐)、textDirection(文本朝向)、format(文本格式)。其中 format 是最灵活、最常用的,我们会重点讲解。
4.1 属性六:textVisible(文本显隐开关)------ 要不要显示数字?
4.1.1 属性的核心定义
textVisible 属性用于控制 QProgressBar 上的数字、百分比等文本内容是否可见 ,默认值为 true(可见)。
通俗理解:textVisible 就像 "进度条文本的开关"------ 你可以打开它(显示百分比 / 数值),也可以关掉它(只显示色块,不显示任何数字)。
这里有几个点需要注意:
- 仅影响文本显隐 :不影响进度条的色块展示、
value计算,也不影响format、alignment等文本相关属性的设置 ------ 只是这些属性需要textVisible=true才会生效; - 设为 false 时:进度条仅显示色块区域,文本区域完全隐藏,适用于仅需视觉反馈进度、无需数字提示的场景;
- 繁忙模式适配 :繁忙模式下(
maximum=0),该属性仍生效 ------ 设为true会显示空文本区域,设为false则完全隐藏文本区域。
4.1.2 数据类型
bool 类型,true 表示文本可见(默认),false 表示文本隐藏。
4.1.3 关联 API 详解(逐词逐句,零模糊)
1. 获取文本是否可见:bool isTextVisible () const
函数原型:
bool QProgressBar::isTextVisible() const;
逐词逐句底层解析:
bool:返回值类型,返回文本是否可见;QProgressBar:::成员函数;isTextVisible():函数名,"获取文本是否可见" 的意思;const:常成员函数。
返回值说明:
true表示文本可见(默认),false表示文本隐藏。
调用示例:
bool isVisible = ui->progressBar->isTextVisible();
if (isVisible) {
qDebug() << "进度文本当前可见";
} else {
qDebug() << "进度文本当前隐藏";
}
2. 设置文本显隐:void setTextVisible (bool visible)
函数原型:
void QProgressBar::setTextVisible(bool visible);
逐词逐句底层解析:
void:无返回值;QProgressBar:::成员函数;setTextVisible():函数名,"设置文本显隐" 的意思;bool visible:入参,visible是true显示文本,false隐藏文本。
参数说明:
visible:true显示文本(默认),false隐藏文本;- 设置后立即生效,无需重启 / 刷新进度条。
调用示例:
// 示例1:隐藏进度文本,仅显示进度色块
ui->progressBar->setTextVisible(false);
// 示例2:重新显示文本(恢复默认)
ui->progressBar->setTextVisible(true);
4.2 属性七:alignment(文本对齐)------ 文本居左、居右还是居中?
4.2.1 属性的核心定义
alignment 属性用于控制 QProgressBar 内文本在其显示区域的水平对齐位置 ,默认值为 Qt::AlignCenter(居中)。
通俗理解:alignment 就像 "进度条文本的位置"------ 你可以让文本在左边、右边、中间。
这里有一个非常重要的坑点,新手很容易踩:
仅水平对齐值生效!垂直对齐值(如 Qt::AlignTop、Qt::AlignBottom)无任何效果!
也就是说,你只能控制文本 "居左、居右、居中",不能控制它 "靠上、靠下"------ 垂直方向默认就是居中的,无法修改。
另外,该属性仅在 textVisible=true 时生效,对齐范围是 "进度条的文本显示区域",而非整个进度条控件区域。
4.2.2 对齐枚举值详解(Qt::Alignment)
为了让你更清楚地理解,我做了一个对比表格:
| 枚举值 | 中文名称 | 功能说明 |
|---|---|---|
Qt::AlignLeft |
左对齐 | 文本在进度条的文本显示区域靠左对齐,水平进度条左侧、垂直进度条顶部对齐; |
Qt::AlignRight |
右对齐 | 文本在进度条的文本显示区域靠右对齐,水平进度条右侧、垂直进度条底部对齐; |
Qt::AlignCenter |
居中对齐 | 文本在进度条的文本显示区域居中对齐(默认),是最常用的对齐方式; |
Qt::AlignJustify |
两端对齐 | 视觉效果等同于左对齐(仅对多行文本生效,进度条文本为单行,无实际差异); |
4.2.3 关联 API 详解(逐词逐句,零模糊)
1. 获取当前对齐方式:Qt::Alignment alignment () const
函数原型:
Qt::Alignment QProgressBar::alignment() const;
逐词逐句底层解析:
Qt::Alignment:返回值类型,返回当前的文本对齐方式;QProgressBar:::成员函数;alignment():函数名,"获取对齐方式" 的意思;const:常成员函数。
返回值说明:
- 返回
Qt::Alignment枚举值,默认返回Qt::AlignCenter。
调用示例:
Qt::Alignment align = ui->progressBar->alignment();
if (align == Qt::AlignCenter) {
qDebug() << "当前文本居中对齐";
}
2. 设置对齐方式:void setAlignment (Qt::Alignment align)
函数原型:
void QProgressBar::setAlignment(Qt::Alignment align);
逐词逐句底层解析:
void:无返回值;QProgressBar:::成员函数;setAlignment():函数名,"设置对齐方式" 的意思;Qt::Alignment align:入参,align是水平对齐枚举值(仅 Left/Right/Center/Justify 生效)。
参数说明:
align:水平对齐枚举值(Qt::AlignLeft、Qt::AlignRight、Qt::AlignCenter);- 垂直对齐值(如
Qt::AlignTop)无效,不要设置; - 仅在
textVisible=true时生效。
调用示例:
// 示例1:水平进度条文本右对齐
ui->progressBar->setOrientation(Qt::Horizontal);
ui->progressBar->setAlignment(Qt::AlignRight);
ui->progressBar->setTextVisible(true);
// 示例2:垂直进度条文本居中对齐(默认)
ui->progressBar->setOrientation(Qt::Vertical);
ui->progressBar->setAlignment(Qt::AlignCenter);
4.3 属性八:textDirection(文本朝向)------ 仅对垂直进度条有用
4.3.1 属性的核心定义
textDirection 属性用于控制 QProgressBar 内文本的排版朝向 ,核心适配垂直进度条 的文本展示场景,默认值为 QProgressBar::TopToBottom(从上到下)。
通俗理解:textDirection 就像 "垂直进度条文本的方向"------ 你可以让文字从上到下正常显示,也可以让它从下到上倒置显示。
这里有几个非常重要的点,新手一定要知道:
- 仅垂直进度条生效 :水平进度条设置该属性无任何视觉效果(文本始终水平显示);
- 仅改变排版朝向:不影响文本内容,仅改变文字的方向;
- BottomToTop 会倒置文字 :设置为
BottomToTop时,文字会倒置展示,可能影响可读性,需结合界面设计场景使用; - 仅在 textVisible=true 时生效。
这个属性实际开发中用得非常少,知道即可,不用深入研究。
4.3.2 枚举值详解(QProgressBar::TextDirection)
| 枚举值 | 中文名称 | 功能说明 |
|---|---|---|
QProgressBar::TopToBottom |
从上到下朝向 | 文本沿垂直进度条从上到下显示(默认),适配常规垂直进度条的视觉习惯; |
QProgressBar::BottomToTop |
从下到上朝向 | 文本沿垂直进度条从下到上显示,文字会倒置展示,适用于特殊视觉设计需求; |
4.3.3 关联 API 详解(逐词逐句,零模糊)
1. 获取当前文本朝向:QProgressBar::TextDirection textDirection () const
函数原型:
QProgressBar::TextDirection QProgressBar::textDirection() const;
返回值说明:
- 返回
QProgressBar::TopToBottom(默认)或QProgressBar::BottomToTop。
2. 设置文本朝向:void setTextDirection (QProgressBar::TextDirection dir)
函数原型:
void QProgressBar::setTextDirection(QProgressBar::TextDirection dir);
参数说明:
dir:QProgressBar::TopToBottom或QProgressBar::BottomToTop;- 生效前提 :需先将进度条设为垂直方向(
orientation=Qt::Vertical),否则无效果。
调用示例:
// 第一步:将进度条设为垂直方向(生效前提)
ui->progressBar->setOrientation(Qt::Vertical);
ui->progressBar->setFixedHeight(200);
// 第二步:设置文本从下到上显示(文字会倒置)
ui->progressBar->setTextDirection(QProgressBar::BottomToTop);
// 第三步:确保文本可见
ui->progressBar->setTextVisible(true);
两属性示例代码:
cpp
#include "widget.h"
#include "ui_widget.h"
#include <QProgressBar>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//OK,那么本文件我们来学习QProgressBar控件的textDirection属性以及alignment属性
//那么alignment属性我们很熟悉了,在学习QLabel控件的时候,我们就学习了
//就是控制文本是要居左还是巴拉巴拉
//这个其实就是需要我们知道,QProgressBar控件,也是可以设置文本的哦·~~~
//这个就得使用format属性了,我们下个文件会解析
//然后就是textDirection属性,这个没什么用,不用管~~~知道即可
//这两个属性其实都没什么用的啦~~~
/**
* @property QProgressBar::textDirection
* @brief QProgressBar进度文本的显示朝向属性
* @details 该属性用于控制进度条内文本的排版朝向,核心适配**垂直进度条**的文本展示场景,默认值为QProgressBar::TopToBottom;
* 水平进度条设置该属性无视觉效果(文本始终水平显示),仅垂直进度条能体现朝向差异;
* 该属性仅在textVisible为true时生效,不影响文本内容,仅改变文本的排版方向。
*
* 【枚举值详解(QProgressBar::TextDirection)】
* | 枚举值 | 中文名称 | 功能说明 |
* |-------------------------|----------------|--------------------------------------------------------------------------|
* | QProgressBar::TopToBottom | 从上到下朝向 | 文本沿垂直进度条从上到下显示(默认),适配常规垂直进度条的视觉习惯; |
* | QProgressBar::BottomToTop | 从下到上朝向 | 文本沿垂直进度条从下到上显示,文字会倒置展示,适用于特殊视觉设计需求; |
*
* 【关联API详解】
* 1. QProgressBar::TextDirection textDirection() const
* - 功能:获取当前文本朝向
* - 返回值:QProgressBar::TextDirection枚举值,默认返回TopToBottom
* - 调用示例:
* QProgressBar::TextDirection dir = ui->progressBar->textDirection();
*
* 2. void setTextDirection(QProgressBar::TextDirection dir)
* - 功能:设置文本的显示朝向
* - 参数:dir - 文本朝向枚举值(TopToBottom/BottomToTop)
* - 生效前提:需先将进度条设为垂直方向(orientation=Qt::Vertical),否则无效果
* - 示例:
* // 第一步:将进度条设为垂直方向(生效前提)
* ui->progressBar->setOrientation(Qt::Vertical);
* // 第二步:设置文本从下到上显示
* ui->progressBar->setTextDirection(QProgressBar::BottomToTop);
* // 第三步:确保文本可见
* ui->progressBar->setTextVisible(true);
*
* 【关键注意事项】
* 1. 方向依赖:仅垂直进度条(Qt::Vertical)能体现文本朝向差异,水平进度条设置后无任何视觉变化;
* 2. 文本可见性:需保证textVisible=true,否则该属性设置无意义;
* 3. 视觉适配:BottomToTop朝向会导致文字倒置,需结合界面设计场景使用,避免影响可读性。
*
* ---
*
* @property QProgressBar::alignment
* @brief QProgressBar进度文本的对齐方式属性
* @details 该属性用于控制进度条内文本在其显示区域的水平对齐位置,默认值为Qt::AlignCenter;
* 仅当textVisible为true时生效,支持Qt::Alignment枚举的水平对齐值(垂直对齐值无效果),是调整文本位置的核心属性。
*
* 【对齐枚举值详解(Qt::Alignment)】
* | 枚举值 | 中文名称 | 功能说明 |
* |---------------------|------------|--------------------------------------------------------------------------|
* | Qt::AlignLeft | 左对齐 | 文本在进度条的文本显示区域靠左对齐,水平进度条左侧、垂直进度条顶部对齐; |
* | Qt::AlignRight | 右对齐 | 文本在进度条的文本显示区域靠右对齐,水平进度条右侧、垂直进度条底部对齐; |
* | Qt::AlignCenter | 居中对齐 | 文本在进度条的文本显示区域居中对齐(默认),是最常用的对齐方式; |
* | Qt::AlignJustify | 两端对齐 | 视觉效果等同于左对齐(仅对多行文本生效,进度条文本为单行,无实际差异); |
*
* 【关联API详解】
* 1. Qt::Alignment alignment() const
* - 功能:获取当前文本的对齐方式
* - 返回值:Qt::Alignment枚举值,默认返回Qt::AlignCenter
* - 调用示例:
* Qt::Alignment align = ui->progressBar->alignment();
*
* 2. void setAlignment(Qt::Alignment align)
* - 功能:设置文本的对齐方式
* - 参数:align - 水平对齐枚举值(仅Left/Right/Center/Justify生效)
* - 示例:
* // 水平进度条文本右对齐
* ui->progressBar->setOrientation(Qt::Horizontal);
* ui->progressBar->setAlignment(Qt::AlignRight);
* ui->progressBar->setTextVisible(true);
*
* // 垂直进度条文本居中对齐(默认)
* ui->progressBar->setOrientation(Qt::Vertical);
* ui->progressBar->setAlignment(Qt::AlignCenter);
*
* 【关键注意事项】
* 1. 仅水平对齐生效:设置垂直对齐值(如Qt::AlignTop)无任何效果,进度条文本仅支持水平对齐;
* 2. 区域限制:对齐范围是进度条的文本显示区域,而非整个进度条控件区域;
* 3. 优先级:对齐方式优先级高于文本朝向,先确定对齐位置,再应用朝向。
*
* 【典型组合示例】
* // 需求:垂直进度条、文本从下到上显示、文本右对齐、显示百分比
* ui->progressBar->setOrientation(Qt::Vertical); // 垂直方向
* ui->progressBar->setTextDirection(QProgressBar::BottomToTop); // 文本从下到上
* ui->progressBar->setAlignment(Qt::AlignRight); // 文本右对齐
* ui->progressBar->setTextVisible(true); // 显示文本
* ui->progressBar->setFormat("%p%"); // 百分比格式
* ui->progressBar->setMinimum(0);
* ui->progressBar->setMaximum(100);
* ui->progressBar->setValue(60); // 显示"60%",右对齐+从下到上朝向
*/
//还有一个属性就是textVisible,就是控制进度条的文本(数字)可不可见,一般都是设置为可见的,默认也是可见的~~
/**
* @property QProgressBar::textVisible
* @brief QProgressBar进度文本(数字/百分比)的显示开关属性
* @details 该属性用于控制进度条上的数字、百分比等文本内容是否可见,默认值为true(可见);
* 仅影响文本的显示状态,不会改变进度条的色块展示、进度值(value)计算,也不影响format、alignment等文本相关属性的设置(只是这些属性需textVisible=true才会生效);
* 设为false时,进度条仅显示色块区域,文本区域完全隐藏,适用于仅需视觉反馈进度、无需数字提示的场景。
*
* 【关联API详解】
* 1. bool isTextVisible() const
* - 功能:获取当前进度文本的显示状态
* - 返回值:true表示文本可见(默认),false表示文本隐藏
* - 调用示例:
* bool isVisible = ui->progressBar->isTextVisible();
* if (isVisible) {
* qDebug() << "进度文本当前可见";
* }
*
* 2. void setTextVisible(bool visible)
* - 功能:设置进度文本的显示/隐藏状态
* - 参数:visible - true显示文本,false隐藏文本
* - 生效规则:设置后立即生效,无需重启/刷新进度条
* - 示例:
* // 隐藏进度文本,仅显示进度色块
* ui->progressBar->setTextVisible(false);
* // 重新显示文本(恢复默认)
* ui->progressBar->setTextVisible(true);
*
* 【关键注意事项】
* 1. 显隐独立:文本隐藏(false)时,进度条的色块、进度值更新等核心功能不受任何影响;
* 2. 属性兼容:即使textVisible=false,仍可正常设置format、alignment等文本属性,仅不会显示;
* 3. 繁忙模式适配:繁忙模式(maximum=0)下,该属性仍生效------设为true会显示空文本区域,设为false则完全隐藏文本区域;
* 4. 性能影响:切换该属性无明显性能开销,可根据业务逻辑动态调整(如任务开始隐藏、完成显示百分比)。
*
* 【典型使用示例】
* // 场景1:常规进度条(显示百分比文本)
* ui->progressBar->setMinimum(0);
* ui->progressBar->setMaximum(100);
* ui->progressBar->setTextVisible(true); // 显示文本(默认)
* ui->progressBar->setFormat("%p%");
* ui->progressBar->setValue(80); // 显示"80%"
*
* // 场景2:仅展示色块的进度条(隐藏文本)
* ui->progressBar->setTextVisible(false); // 隐藏文本
* ui->progressBar->setValue(80); // 仅显示80%进度的色块,无任何数字
*
* // 场景3:动态切换文本显隐(任务中隐藏,完成后显示)
* connect(ui->btnStart, &QPushButton::clicked, this, [=](){
* ui->progressBar->setTextVisible(false); // 任务开始,隐藏文本
* // 模拟进度更新
* QTimer *timer = new QTimer(this);
* int val = 0;
* connect(timer, &QTimer::timeout, this, [&](){
* val += 10;
* ui->progressBar->setValue(val);
* if (val >= 100) {
* timer->stop();
* ui->progressBar->setTextVisible(true); // 任务完成,显示文本
* }
* });
* timer->start(500);
* });
*/
QProgressBar* progressbar=new QProgressBar(this);
progressbar->setMaximum(100);
progressbar->setMinimum(0);
progressbar->setValue(50);
progressbar->setGeometry(200,200,500,200);
progressbar->setFormat("进度:%p");
//居右展示
progressbar->setAlignment(Qt::AlignLeft);
}
Widget::~Widget()
{
delete ui;
}
4.4 属性九:format(文本格式)------ 最灵活的文本属性,重点讲解!
4.4.1 属性的核心定义
format 属性用于自定义 QProgressBar 显示的文本内容格式,支持占位符动态替换 ,默认值为 "%p%"(显示百分比,如 "50%")。
通俗理解:format 就像 "进度条文本的模板"------ 你可以在模板里写普通文字,再用特殊的 "占位符" 代替动态内容(比如百分比、当前值),Qt 会自动把占位符替换成实际的数值。
这个属性是 QProgressBar 文本相关属性中最灵活、最常用的,一定要重点掌握!
这里有几个点需要注意:
- 仅在 textVisible=true 时生效;
- 若设置为空字符串(""):文本区域仍保留但内容为空;
- 占位符区分大小写 :必须是小写的
%p、%v、%m、%t,大写无效。
4.4.2 占位符详解(核心,必知!)
QProgressBar 支持四个占位符,其中前两个最常用,后两个需要手动关联逻辑:
| 占位符 | 中文含义 | 功能说明 |
|---|---|---|
%p |
进度百分比 | 显示 0-100 的百分比值(如 value=50 时显示 "50",默认格式 %p% 会显示 "50%"),最常用; |
%v |
进度当前数值 | 显示 value 的原始数值(如 minimum=0、maximum=100 时,value=50 显示 "50"); |
%m |
剩余时间(毫秒) | 需手动结合定时器 / 任务逻辑绑定数值,Qt 无默认计算逻辑,默认显示空值; |
%t |
总时间(毫秒) | 需手动结合定时器 / 任务逻辑绑定数值,Qt 无默认计算逻辑,默认显示空值; |
⚠️ 重要提醒 :%m 和 %t 这两个占位符,Qt 不会自动计算 "剩余时间" 和 "总时间"------ 你需要自己用定时器统计任务耗时,然后通过某种方式关联(不过 QProgressBar 没有直接设置 %m/%t 值的公共 API,所以这两个占位符实际用得很少,知道即可)。
我们重点掌握 %p 和 %v 就够了!
4.4.3 关联 API 详解(逐词逐句,零模糊)
1. 获取当前文本格式:QString format () const
函数原型:
QString QProgressBar::format() const;
逐词逐句底层解析:
QString:返回值类型,返回当前的文本格式字符串;QProgressBar:::成员函数;format():函数名,"获取文本格式" 的意思;const:常成员函数。
返回值说明:
- 返回
QString类型的字符串,默认返回"%p%"。
调用示例:
QString fmt = ui->progressBar->format();
qDebug() << "当前文本格式:" << fmt; // 输出 "%p%"(默认)
2. 设置文本格式:void setFormat (const QString &format)
函数原型:
void QProgressBar::setFormat(const QString &format);
逐词逐句底层解析:
void:无返回值;QProgressBar:::成员函数;setFormat():函数名,"设置文本格式" 的意思;const QString &format:入参,format是包含占位符的格式字符串(支持普通文本 + 占位符组合)。
参数说明:
format:包含占位符的格式字符串(如"%p%"、"进度:%v/100");- 支持普通文本和占位符组合;
- 修改后立即生效,文本会立即刷新为新格式。
调用示例:
// 先设置常规进度范围
ui->progressBar->setMinimum(0);
ui->progressBar->setMaximum(100);
ui->progressBar->setValue(50);
ui->progressBar->setTextVisible(true);
// 示例1:默认格式:显示"50%"
ui->progressBar->setFormat("%p%");
// 示例2:自定义格式:显示"进度:50/100"
ui->progressBar->setFormat("进度:%v/100");
// 示例3:组合格式:显示"完成 50%"
ui->progressBar->setFormat("完成 %p%");
// 示例4:清空格式:文本区域为空
ui->progressBar->setFormat("");
4.4.4 典型组合示例
// 需求:垂直反向进度条,显示"当前进度:80/200"格式文本
ui->progressBar->setMinimum(0);
ui->progressBar->setMaximum(200);
ui->progressBar->setOrientation(Qt::Vertical); // 垂直方向
ui->progressBar->setInvertAppearance(true); // 从上到下增长
ui->progressBar->setTextVisible(true); // 显示文本
ui->progressBar->setFormat("当前进度:%v/200"); // 自定义格式
ui->progressBar->setValue(80); // 显示"当前进度:80/200",色块从上到下填充 80/200 区域
示例代码:
cpp
#include "widget.h"
#include "ui_widget.h"
#include <QProgressBar>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//OK,那么本文件我们来学习QProgressBar的orientation属性,invertAppearance属性、format属性
//前两个属性比较简单,orientation属性是控制进度条的方向是水平的还是垂直的
//Qt::Vertical垂直方向,Qt::Horizontal水平方向
//而invertAppearance属性是控制进度条是否是朝反方向增长进度
//最重要的format属性,我们就是要通过这个属性设置QProgressBar控件的文本显示,令其不是单单的数字
//还可以有汉字,包括还能设置数字的显示格式,就是使用占位符
//• %p :表示进度的百分比(0-100)
//• %v :表示进度的数值(0-100)
//• %m :表示剩余时间(以毫秒为单位)
//• %t :表示总时间(以毫秒为单位)
//它的使用方法也是很简单,就像printf一样使用就差不多, progressbar->setFormat("进度:%p");
//但是它获取数值,依旧是从QProgressBar的value属性获取哦~~~
/**
* @property QProgressBar::orientation
* @brief QProgressBar的显示方向属性
* @details 该属性控制进度条的整体展示方向是水平还是垂直,默认值为Qt::Horizontal(水平);
* 方向仅改变进度条的视觉布局,不影响进度值(value)的计算逻辑,垂直进度条的进度增长方向受invertAppearance属性联动控制。
*
* 【枚举值详解(Qt::Orientation)】
* | 枚举值 | 中文名称 | 功能说明 |
* |---------------------|------------|--------------------------------------------------------------------------|
* | Qt::Horizontal | 水平方向 | 进度条沿水平方向展示(默认),是最常用的展示形式,进度增长方向为左右向; |
* | Qt::Vertical | 垂直方向 | 进度条沿垂直方向展示,需调整控件高度以体现进度变化,进度增长方向为上下向; |
*
* 【关联API详解】
* 1. Qt::Orientation orientation() const
* - 功能:获取当前进度条的显示方向
* - 返回值:Qt::Orientation枚举值,默认返回Qt::Horizontal
* - 调用示例:
* Qt::Orientation orient = ui->progressBar->orientation();
*
* 2. void setOrientation(Qt::Orientation orient)
* - 功能:设置进度条的显示方向
* - 参数:orient - 方向枚举值(Horizontal/Vertical)
* - 示例:
* // 切换为垂直进度条(需调整控件高度才能直观看到效果)
* ui->progressBar->setOrientation(Qt::Vertical);
* ui->progressBar->setFixedHeight(200); // 设置垂直进度条高度
*
* 【关键注意事项】
* 1. 布局适配:垂直进度条需设置足够的高度(如setFixedHeight),否则视觉效果不明显;
* 2. 联动规则:方向切换后,invertAppearance的反向增长逻辑会自动适配新方向;
* 3. 文本适配:垂直进度条的文本朝向需通过textDirection属性调整,alignment仍控制水平对齐。
*
* ---
*
* @property QProgressBar::invertAppearance
* @brief QProgressBar的进度反向增长属性
* @details 该属性控制进度条的色块填充方向是否反向,默认值为false(正向增长);
* 仅改变进度的视觉增长方向,不影响value、minimum、maximum的数值计算,是纯视觉层面的调整。
*
* 【不同方向下的增长规则(核心)】
* | 进度条方向 | 正向增长(invertAppearance=false) | 反向增长(invertAppearance=true) |
* |------------------|------------------------------------|------------------------------------|
* | 水平(Horizontal)| 进度色块从左向右填充 | 进度色块从右向左填充 |
* | 垂直(Vertical) | 进度色块从下向上填充 | 进度色块从上向下填充 |
*
* 【关联API详解】
* 1. bool invertAppearance() const
* - 功能:获取是否开启进度反向增长
* - 返回值:false正向(默认),true反向
* - 调用示例:
* bool isInvert = ui->progressBar->invertAppearance();
*
* 2. void setInvertAppearance(bool invert)
* - 功能:设置进度增长方向是否反向
* - 参数:invert - true开启反向,false关闭
* - 示例:
* // 水平进度条反向增长(从右到左填充)
* ui->progressBar->setOrientation(Qt::Horizontal);
* ui->progressBar->setInvertAppearance(true);
* ui->progressBar->setValue(50); // 右侧50%区域填充色块
*
* 【关键注意事项】
* 1. 数值无关:反向增长仅改变视觉填充方向,value的数值大小和百分比计算不受任何影响;
* 2. 即时生效:设置后无需刷新进度条,当前进度色块会立即切换填充方向;
* 3. 繁忙模式适配:繁忙模式(maximum=0)下,反向属性会改变滚动色块的移动方向。
*
* ---
*
* @property QProgressBar::format
* @brief QProgressBar的进度文本格式属性
* @details 该属性用于自定义进度条显示的文本内容格式,支持占位符动态替换,默认值为"%p%"(显示百分比);
* 仅当textVisible为true时生效,若设置为空字符串(""),文本区域仍保留但内容为空,适用于自定义文本展示场景。
*
* 【占位符详解(核心)】
* | 占位符 | 中文含义 | 功能说明 |
* |--------|----------------|--------------------------------------------------------------------------|
* | %p | 进度百分比 | 显示0-100的百分比值(如value=50时显示"50",默认格式%p%会显示"50%"),最常用; |
* | %v | 进度当前数值 | 显示value的原始数值(如minimum=0、maximum=100时,value=50显示"50"); |
* | %m | 剩余时间(毫秒)| 需手动结合定时器/任务逻辑绑定数值,Qt无默认计算逻辑,默认显示空值; |
* | %t | 总时间(毫秒) | 需手动结合定时器/任务逻辑绑定数值,Qt无默认计算逻辑,默认显示空值; |
*
* 【关联API详解】
* 1. QString format() const
* - 功能:获取当前文本格式字符串
* - 返回值:QString类型,默认返回"%p%"
* - 调用示例:
* QString fmt = ui->progressBar->format();
*
* 2. void setFormat(const QString &format)
* - 功能:设置自定义文本格式
* - 参数:format - 包含占位符的格式字符串(支持普通文本+占位符组合)
* - 示例:
* // 默认格式:显示"50%"
* ui->progressBar->setFormat("%p%");
* // 自定义格式:显示"进度:50/100"
* ui->progressBar->setFormat("进度:%v/100");
* // 组合格式:显示"完成50%,剩余1000ms"(需手动绑定%m值)
* ui->progressBar->setFormat("完成%p%,剩余%m ms");
* // 清空格式:文本区域为空
* ui->progressBar->setFormat("");
*
* 【关键注意事项】
* 1. %m/%t使用:这两个占位符需手动通过代码计算并关联(如定时器统计耗时),Qt不会自动计算剩余/总时间;
* 2. 格式生效:修改format后,文本会立即刷新为新格式,无需重启进度条;
* 3. 百分比计算:%p的取值基于 (value - minimum)/(maximum - minimum) × 100,与maximum是否为100无关;
* 4. 文本长度:格式字符串过长可能导致文本超出进度条区域,需结合控件宽度适配。
*
* 【典型组合示例】
* // 需求:垂直反向进度条,显示"当前进度:80/200"格式文本
* ui->progressBar->setMinimum(0);
* ui->progressBar->setMaximum(200);
* ui->progressBar->setOrientation(Qt::Vertical); // 垂直方向
* ui->progressBar->setInvertAppearance(true); // 从上到下增长
* ui->progressBar->setTextVisible(true); // 显示文本
* ui->progressBar->setFormat("当前进度:%v/200"); // 自定义格式
* ui->progressBar->setValue(80); // 显示"当前进度:80/200",色块从上到下填充80/200区域
*/
QProgressBar* progressbar=new QProgressBar(this);
progressbar->setMaximum(100);
progressbar->setMinimum(0);
progressbar->setValue(50);
progressbar->setGeometry(200,200,500,200);
// * | 占位符 | 中文含义 | 功能说明 |
// * |--------|----------------|--------------------------------------------------------------------------|
// * | %p | 进度百分比 | 显示0-100的百分比值(如value=50时显示"50",默认格式%p%会显示"50%"),最常用; |
// * | %v | 进度当前数值 | 显示value的原始数值(如minimum=0、maximum=100时,value=50显示"50"); |
// * | %m | 剩余时间(毫秒)| 需手动结合定时器/任务逻辑绑定数值,Qt无默认计算逻辑,默认显示空值; |
// * | %t | 总时间(毫秒) | 需手动结合定时器/任务逻辑绑定数值,Qt无默认计算逻辑,默认显示空值; |
progressbar->setFormat("进度:%p");
progressbar->setFormat("进度:%v");
progressbar->setFormat("进度:%m");
progressbar->setFormat("进度:%t");
//那么其实我们还可以设置一个定时进度条,但是没什么必要了就是,以后用到再说,毕竟我们之前也使用过QTimer了~~~
}
Widget::~Widget()
{
delete ui;
}
第五章 进阶:用样式表自定义 QProgressBar 颜色
默认的 QProgressBar 通常是绿色的,但有时候我们需要自定义颜色 ------ 比如红色表示错误、黄色表示警告、蓝色表示正常。QProgressBar 是 QWidget 的子类,所以我们可以用 Qt Style Sheets(QSS,样式表) 来修改它的颜色和样式,就像网页用 CSS 一样。
这里我们讲一个最常用的场景:把进度条改成红色。
5.1 核心样式表选择器
在 QSS 中,我们用两个选择器来控制 QProgressBar:
QProgressBar:控制进度条的背景、边框等整体样式;QProgressBar::chunk:控制进度条中 "填充色块" 的样式(这个是关键!)。
5.2 代码示例:创建一个红色的进度条
#include "widget.h"
#include "ui_widget.h"
#include <QProgressBar>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QProgressBar *progressBar = new QProgressBar(this);
progressBar->setGeometry(100, 100, 400, 30);
progressBar->setMinimum(0);
progressBar->setMaximum(100);
progressBar->setValue(50);
progressBar->setTextVisible(true);
progressBar->setFormat("%p%");
progressBar->setAlignment(Qt::AlignCenter); // 居中文本,避免文本跑到左上角(Qt 某些版本的小问题)
// 关键:用样式表设置红色进度条
progressBar->setStyleSheet(R"(
QProgressBar {
border: 2px solid grey; /* 灰色边框 */
border-radius: 5px; /* 圆角 */
text-align: center; /* 文本居中(配合 alignment)*/
background-color: #f0f0f0; /* 浅灰色背景 */
}
QProgressBar::chunk {
background-color: #FF0000; /* 红色填充色块(核心!)*/
width: 20px; /* 色块宽度(可选,让色块有间隔感)*/
}
)");
}
Widget::~Widget()
{
delete ui;
}
5.3 样式表详解
我们来逐部分解释上面的样式表:
QProgressBar部分:border: 2px solid grey;:设置 2 像素宽的灰色实线边框;border-radius: 5px;:设置 5 像素的圆角,让进度条更好看;text-align: center;:文本居中(配合setAlignment(Qt::AlignCenter)一起用,避免 Qt 某些版本中文本跑到左上角);background-color: #f0f0f0;:设置进度条的背景色为浅灰色。
QProgressBar::chunk部分(核心):background-color: #FF0000;:设置填充色块的颜色为红色(#FF0000是红色的十六进制颜色码)------ 这是最关键的一行!width: 20px;:设置每个色块的宽度为 20 像素(可选,让色块有间隔感,像老式进度条一样;如果不设置,就是一个连续的色块)。
你可以把 #FF0000 改成其他颜色码,比如 #00FF00(绿色)、#0000FF(蓝色)、#FFFF00(黄色),就能得到不同颜色的进度条了!
第六章 综合实战:QTimer + QProgressBar 实现定时增长进度条
现在,我们把之前学的 QProgressBar 和 QTimer 结合起来,实现一个完整的实战项目:定时增长的进度条------ 需求是:进度条从 0 开始,每隔 100 毫秒(0.1 秒)增长 1,直到 100 停止,显示百分比文本,居中对齐。
这个实战会覆盖我们之前讲的所有核心内容:QProgressBar 的 minimum、maximum、value、textVisible、alignment、format,以及 QTimer 的 setInterval()、start()、stop()、timeout() 信号,非常适合巩固学习。
6.1 需求分析
我们的需求很明确:
- 界面上有一个水平进度条,范围 0-100,初始值 0;
- 显示百分比文本("50%"),居中对齐;
- 用 QTimer 实现每隔 100ms(0.1 秒)增长 1;
- 增长到 100 时,停止定时器,提示 "完成"。
6.2 代码实现
6.2.1 头文件(widget.h)
首先,我们需要在头文件中声明成员变量和槽函数:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QProgressBar>
#include <QTimer>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
// 声明槽函数:更新进度条
private slots:
void updateProgress();
private:
Ui::Widget *ui;
// 成员变量:QProgressBar 和 QTimer,方便在槽函数中访问
QProgressBar *progressBar;
QTimer *timer;
};
#endif // WIDGET_H
6.2.2 源文件(widget.cpp)
然后,我们在源文件中实现构造函数和槽函数:
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// ==========================================
// 1. 初始化 QProgressBar
// ==========================================
progressBar = new QProgressBar(this);
progressBar->setGeometry(100, 150, 400, 30);
// 设置范围:0-100
progressBar->setMinimum(0);
progressBar->setMaximum(100);
// 设置初始值:0
progressBar->setValue(0);
// 显示文本
progressBar->setTextVisible(true);
// 文本居中对齐
progressBar->setAlignment(Qt::AlignCenter);
// 文本格式:显示百分比
progressBar->setFormat("%p%");
// ==========================================
// 2. 初始化 QTimer
// ==========================================
timer = new QTimer(this);
// 设置间隔:100ms(0.1 秒)
timer->setInterval(100);
// 绑定 timeout 信号与 updateProgress 槽函数
connect(timer, &QTimer::timeout, this, &Widget::updateProgress);
// 启动定时器
timer->start(100);
qDebug() << "进度条开始增长...";
}
// ==========================================
// 3. 实现 updateProgress 槽函数
// ==========================================
void Widget::updateProgress()
{
// 获取当前进度值
int value = progressBar->value();
// 如果进度达到最大值,停止定时器
if (value >= progressBar->maximum()) {
timer->stop();
qDebug() << "进度条完成!";
// 可以在这里添加"完成"后的逻辑,比如弹出提示框
return;
}
// 进度值 +1
progressBar->setValue(value + 1);
}
Widget::~Widget()
{
// 析构时停止定时器(虽然父对象销毁时会自动处理,但显式停止更安全)
if (timer->isActive()) {
timer->stop();
}
delete ui;
}
6.3 代码详解
我们来逐部分解释代码:
- 初始化 QProgressBar :
- 创建 QProgressBar 对象,设置位置和大小;
- 设置范围 0-100,初始值 0;
- 显示文本,居中对齐,格式为百分比。
- 初始化 QTimer :
- 创建 QTimer 对象,设置间隔 100ms(0.1 秒);
- 绑定
timeout信号到updateProgress槽函数 ------ 每 100ms 触发一次updateProgress(); - 启动定时器。
- 实现
updateProgress()槽函数 :- 获取当前进度值;
- 如果达到最大值,停止定时器,打印 "完成";
- 否则,进度值 +1,更新进度条。
完整示例代码:
cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//OK大家,那么本文件我们就来学习QProgressBar控件,其实也就是进度条啦~~~大家都不陌生
//这个也还是很简单的
/**
* @class QProgressBar
* @brief Qt中用于可视化展示任务进度的进度条控件
* @details QProgressBar是Qt提供的进度可视化核心控件,主要用于展示耗时任务的完成进度(如文件下载、数据加载、安装流程等);
* 支持自定义进度范围、显示方向、进度文本格式、文本对齐方式等,是界面中反馈任务进度的关键组件;
* 重要提醒:类名拼写为QProgressBar(Progress=进度),切勿错误拼写成QProcessBar(Process=进程)!
*
* 【核心属性详解】
*
* ===================================== 属性1:minimum =====================================
* @property QProgressBar::minimum
* @brief 进度条的最小值属性
* @details 该属性定义进度条进度范围的下限值,默认值为0;
* 最小值必须小于等于最大值(若手动设置最小值大于最大值,Qt会自动交换二者),进度条的有效进度范围为 [minimum, maximum]。
*
* 【关联API详解】
* 1. int minimum() const
* - 功能:获取当前设置的最小值
* - 返回值:int类型,默认返回0
*
* 2. void setMinimum(int min)
* - 功能:设置进度条最小值
* - 参数:min - 非负整数(常规场景建议设为0)
* - 示例:
* ui->progressBar->setMinimum(0); // 设置最小值为0(默认值)
* ui->progressBar->setMinimum(10); // 自定义最小值为10(需配合maximum>10)
*
* ===================================== 属性2:maximum =====================================
* @property QProgressBar::maximum
* @brief 进度条的最大值属性
* @details 该属性定义进度条进度范围的上限值,默认值为100;
* 特殊规则:若将最大值设为0,进度条会进入**繁忙模式**(无具体进度值,进度条色块来回滚动,适用于未知耗时的任务)。
*
* 【关联API详解】
* 1. int maximum() const
* - 功能:获取当前设置的最大值
* - 返回值:int类型,默认返回100
*
* 2. void setMaximum(int max)
* - 功能:设置进度条最大值
* - 参数:max - 整数(≥minimum,设为0进入繁忙模式)
* - 示例:
* ui->progressBar->setMaximum(100); // 常规进度(0-100,百分比)
* ui->progressBar->setMaximum(0); // 繁忙模式(未知进度,进度条滚动)
* ui->progressBar->setMaximum(500); // 自定义进度范围(0-500)
*
* ===================================== 属性3:value =====================================
* @property QProgressBar::value
* @brief 进度条的当前进度值属性
* @details 该属性表示进度条当前的进度值,取值范围严格限制在 [minimum, maximum] 之间;
* 若当前值等于最大值,代表任务100%完成;若最大值设为0(繁忙模式),该属性失效(进度条无固定值)。
*
* 【关联API详解】
* 1. int value() const
* - 功能:获取当前进度值
* - 返回值:int类型,默认返回0
*
* 2. void setValue(int val)
* - 功能:设置当前进度值
* - 参数:val - 整数,超出[minimum, maximum]范围时会被自动截断
* - 示例:
* ui->progressBar->setMinimum(0);
* ui->progressBar->setMaximum(100);
* ui->progressBar->setValue(50); // 设置当前进度为50(对应50%)
* ui->progressBar->setValue(120); // 超出最大值,自动截断为100
*
* ===================================== 属性4:alignment =====================================
* @property QProgressBar::alignment
* @brief 进度条内文本的对齐方式属性
* @details 该属性控制进度条上显示的文本(百分比/数值)的对齐位置,默认值为Qt::AlignCenter;
* 仅当textVisible为true时生效,支持Qt::Alignment枚举的水平对齐值,垂直对齐无效果。
*
* 【对齐枚举值详解】
* | 枚举值 | 功能说明 |
* |---------------------|------------------------------|
* | Qt::AlignLeft | 文本左对齐 |
* | Qt::AlignRight | 文本右对齐 |
* | Qt::AlignCenter | 文本居中对齐(默认)|
* | Qt::AlignJustify | 文本两端对齐(效果同左对齐) |
*
* 【关联API详解】
* 1. Qt::Alignment alignment() const
* - 功能:获取当前文本对齐方式
* - 返回值:Qt::Alignment枚举值,默认返回Qt::AlignCenter
*
* 2. void setAlignment(Qt::Alignment align)
* - 功能:设置文本对齐方式
* - 参数:align - 对齐枚举值(仅水平对齐生效)
* - 示例:
* ui->progressBar->setAlignment(Qt::AlignRight); // 文本右对齐
* ui->progressBar->setAlignment(Qt::AlignCenter); // 文本居中(默认)
*
* ===================================== 属性5:textVisible =====================================
* @property QProgressBar::textVisible
* @brief 进度条文本的显示开关属性
* @details 该属性控制进度条上的数字/百分比文本是否可见,默认值为true(可见);
* 设为false时,仅显示进度条的色块,不显示任何文本,适用于仅需视觉反馈进度的场景。
*
* 【关联API详解】
* 1. bool isTextVisible() const
* - 功能:获取文本是否可见
* - 返回值:true可见(默认),false隐藏
*
* 2. void setTextVisible(bool visible)
* - 功能:设置文本显示状态
* - 参数:visible - true显示文本,false隐藏文本
* - 示例:
* ui->progressBar->setTextVisible(false); // 隐藏进度文本,仅显示色块
*
* ===================================== 属性6:orientation =====================================
* @property QProgressBar::orientation
* @brief 进度条的显示方向属性
* @details 该属性控制进度条是水平显示还是垂直显示,默认值为Qt::Horizontal(水平);
* 垂直进度条的进度增长方向受invertAppearance影响(正向从下到上,反向从上到下)。
*
* 【枚举值详解】
* | 枚举值 | 功能说明 |
* |---------------------|------------------------------|
* | Qt::Horizontal | 水平进度条(默认)|
* | Qt::Vertical | 垂直进度条 |
*
* 【关联API详解】
* 1. Qt::Orientation orientation() const
* - 功能:获取当前显示方向
* - 返回值:Qt::Orientation枚举值,默认返回Qt::Horizontal
*
* 2. void setOrientation(Qt::Orientation orient)
* - 功能:设置进度条显示方向
* - 参数:orient - 方向枚举值
* - 示例:
* ui->progressBar->setOrientation(Qt::Vertical); // 设置为垂直进度条
*
* ===================================== 属性7:invertAppearance =====================================
* @property QProgressBar::invertAppearance
* @brief 进度条进度的反向增长属性
* @details 该属性控制进度条的进度是否朝反方向增长,默认值为false(正向增长);
* 反向增长仅改变进度色块的填充方向,不影响进度值的计算。
*
* 【增长方向规则】
* | 显示方向 | 正向增长(false)| 反向增长(true)|
* |----------------|-------------------------|-------------------------|
* | 水平(Horizontal) | 从左到右填充 | 从右到左填充 |
* | 垂直(Vertical) | 从下到上填充 | 从上到下填充 |
*
* 【关联API详解】
* 1. bool invertAppearance() const
* - 功能:获取是否开启反向增长
* - 返回值:false正向(默认),true反向
*
* 2. void setInvertAppearance(bool invert)
* - 功能:设置进度增长方向
* - 参数:invert - true开启反向,false关闭
* - 示例:
* ui->progressBar->setInvertAppearance(true); // 水平进度条从右到左增长
*
* ===================================== 属性8:textDirection =====================================
* @property QProgressBar::textDirection
* @brief 进度条文本的朝向属性
* @details 该属性控制进度条文本的显示朝向,主要适配垂直进度条的文本展示,默认值为QProgressBar::TopToBottom;
* 水平进度条设置该属性无明显效果,仅垂直进度条生效。
*
* 【枚举值详解】
* | 枚举值 | 功能说明 |
* |-------------------------|------------------------------|
* | QProgressBar::TopToBottom | 文本从上到下显示(默认)|
* | QProgressBar::BottomToTop | 文本从下到上显示 |
*
* 【关联API详解】
* 1. QProgressBar::TextDirection textDirection() const
* - 功能:获取文本朝向
* - 返回值:QProgressBar::TextDirection枚举值
*
* 2. void setTextDirection(QProgressBar::TextDirection dir)
* - 功能:设置文本朝向
* - 参数:dir - 文本朝向枚举值
* - 示例:
* ui->progressBar->setOrientation(Qt::Vertical); // 先设为垂直进度条
* ui->progressBar->setTextDirection(QProgressBar::BottomToTop); // 文本从下到上显示
*
* ===================================== 属性9:format =====================================
* @property QProgressBar::format
* @brief 进度条文本的显示格式属性
* @details 该属性自定义进度条显示的文本格式,支持占位符替换,默认值为"%p%"(显示百分比);
* 仅当textVisible为true时生效,若设置为空字符串,文本区域仍保留但内容为空。
*
* 【占位符详解(核心)】
* | 占位符 | 功能说明 |
* |--------|--------------------------------------------------------------------------|
* | %p | 进度百分比(0-100,显示为"0%"~"100%",最常用)|
* | %v | 进度当前数值(如最小值0、最大值100时,值50显示为"50")|
* | %m | 剩余时间(毫秒,需手动结合定时器/任务逻辑关联,默认无有效数值)|
* | %t | 总时间(毫秒,需手动结合定时器/任务逻辑关联,默认无有效数值)|
*
* 【关联API详解】
* 1. QString format() const
* - 功能:获取当前文本格式
* - 返回值:QString类型,默认返回"%p%"
*
* 2. void setFormat(const QString &format)
* - 功能:设置文本显示格式
* - 参数:format - 包含占位符的格式字符串
* - 示例:
* ui->progressBar->setFormat("%p%"); // 默认,显示"50%"
* ui->progressBar->setFormat("进度:%v/100"); // 显示"进度:50/100"
* ui->progressBar->setFormat("完成%p%,剩余%m ms"); // 需绑定时间逻辑才显示有效剩余时间
*
* 【典型使用示例】
* // 示例1:常规水平进度条(0-100,百分比显示,居中文本)
* ui->progressBar->setMinimum(0);
* ui->progressBar->setMaximum(100);
* ui->progressBar->setOrientation(Qt::Horizontal);
* ui->progressBar->setTextVisible(true);
* ui->progressBar->setAlignment(Qt::AlignCenter);
* ui->progressBar->setFormat("%p%");
* ui->progressBar->setValue(75); // 显示"75%"
*
* // 示例2:繁忙模式(未知进度,无文本)
* ui->progressBar->setMaximum(0); // 开启繁忙模式
* ui->progressBar->setTextVisible(false); // 隐藏文本
*
* // 示例3:垂直反向进度条(自定义格式)
* ui->progressBar->setOrientation(Qt::Vertical);
* ui->progressBar->setInvertAppearance(true); // 从上到下增长
* ui->progressBar->setFormat("当前值:%v");
* ui->progressBar->setValue(30); // 显示"当前值:30"
*/
}
Widget::~Widget()
{
delete ui;
}
第七章 全文总结与学习建议
恭喜你!终于看完了这篇QProgressBar 常见属性详细解析!
如果你跟着文章一步步敲了代码,做了练习,那么现在你已经完全掌握了 QProgressBar 的核心内容:
- 你知道了类名是 QProgressBar,不是 QProcessBar(这个坑一定要避开!);
- 你会用
minimum、maximum、value设置进度范围和当前值,知道了繁忙模式 (maximum=0)的用法; - 你会用
orientation让进度条水平或垂直显示,用invertAppearance让进度反向增长; - 你会用
textVisible控制文本显隐,用alignment让文本居左 / 居右 / 居中(知道垂直对齐无效),用format自定义文本格式(重点掌握%p和%v); - 你还会用样式表自定义进度条的颜色,比如改成红色;
- 你还完成了一个综合实战:用 QTimer 和 QProgressBar 实现定时增长的进度条。
毫不夸张地说,掌握了这些内容,你就掌握了 QProgressBar 开发的 90% 以上的需求!接下来,你可以用这些内容,实现各种你想要的进度条效果。
7.1 核心要点回顾
在结束之前,我们最后再回顾一下这篇文章的核心要点:
- 拼写警告 :
QProgressBar,不是QProcessBar! - 范围与值 :
minimum是最小值(默认 0),maximum是最大值(默认 100),value是当前值;maximum=0进入繁忙模式(未知进度,色块滚动);value超出范围会自动截断,繁忙模式下失效。
- 视觉布局 :
orientation:水平(Horizontal)或垂直(Vertical);invertAppearance:false正向(水平从左到右,垂直从下到上),true反向(水平从右到左,垂直从上到下);- 仅改变视觉,不影响数值。
- 文本显示 :
textVisible:true显示文本,false隐藏;alignment:仅水平对齐生效(Left/Right/Center);textDirection:仅垂直进度条有用,知道即可;format:重点!%p百分比,%v当前值,%m/%t需手动关联。
- 样式表 :用
QProgressBar::chunk控制填充色块颜色。
7.2 最后的话
编程学习没有捷径,唯手熟尔。QProgressBar 的属性虽然看起来很多,但只要你多敲代码、多做练习、多踩坑、多排查,很快就能熟练掌握。
这篇文章虽然很长,但我相信,如果你认真看完了,跟着敲了代码,你一定会对 QProgressBar 有一个极其深刻的理解,再也不会为进度条的实现发愁。
感谢你阅读这篇文章,希望它能帮到你。我们下一篇 Qt 教程再见!