1、背景以及使用的类
使用QProgressBar类实现,很简单!这里会使用两定时器,主要目的是为了防止程序死机时可以快速的得出结论;一:程序整个卡死,二:程序只有一部分卡死;具体方法:一个定时器用来设置进度条的颜色,只用来做这个事情!另一个定时器加载计算进度条的进度,这个定时器用来看你的程序初始化进行到哪一步了!这样分开后,如果颜色不变,说明程序整个死机,重启吧;如果颜色在改变,但是进度条不动了,说明初始化到你设置这个进度的这一步卡死了,程序你可以快速的找到问题所在,这就是它的作用!反正对于我来说很好用就是了。
2、具体实现步骤
①UI界面的设置
这个很简单没只需要一个容器即可,就是用来装QProgressBar控件的容器,形状位置啥的自己看着来,我这里使用的是QVBoxLayout。
②头文件以及全局变量
这里变量你也可以设置局部,但是你得让它能在需要的地方使用就行了,我这里直接全局主要是省事。
#include <QProgressBar>
#include <QTimer>
class ****我省略,写你自己的****{
...
...都省略
...
private:
Ui::MyFrame *ui;
QTimer timer;
QTimer timer2;
QProgressBar progressBar;
}
③.cpp文件的主要内容
或者说是关键的地方,和上面的头文件一样,该省省。但是我有注释,不懂得看注释,看了还不懂那我也不懂。
//在构造函数中:
// 创建一个进度条
progressBar.setRange(0, 100);
// 这里开一个定时器,先设置颜色,一定要先设置颜色,
// 思路很简单,直接就是使用setStyleSheet函数设置,
// QProgressBar{字体,边框等} QProgressBar::chunk {进度条的背景,宽度等}
QObject::connect(&timer2, &QTimer::timeout, [=]() {
static int colorXvalue = 0;
static int colorXvalueFlag = 1;
progressBar.setStyleSheet("QProgressBar{"
"border: 2px solid grey;"
"border-radius: 5px;"
"text-align: center;"
"}"
"QProgressBar::chunk {"
"background-color: rgb(0,"+QString::number(colorXvalue)+",255);"
"width: 20px;"
"}");
// qDebug()<<QString::number(colorXvalue);
if(colorXvalue==0) colorXvalueFlag = 1;//计算颜色 正向变色
if(colorXvalue==200) colorXvalueFlag = -1;//计算颜色 开始逆向变色
colorXvalue += colorXvalueFlag;
});
timer2.start(10);//直接开始就好了,10ms是看着最舒服的
ui->verticalLayout->addWidget(&progressBar);//放在你设置的那个容器里
timer.start(50); //先开始这个定时器,然后再显示本窗口
this->show();//初始化的时候,不用额外的调用很好用
//我的主窗口是另外的一个界面,所以先要实例化一个,你也可以用其他的方式拉起主窗口
//如果你只有一个窗口,那就在最后面初始化你其他代码,在那里更新value 的值,以此结束进度条
MainWindow *w = new MainWindow;
// 连接槽开始更新进度条的值,不要在意细节,这个定时就是可以正常使用
// 这里我是测试的,所以直接加载到99就停了,value的值你自己在其他地方更新
QObject::connect(&timer, &QTimer::timeout, [&,w]() {
int value = progressBar.value() + 1;
if(value>=100) value-=1;
progressBar.setValue(value);
if (value >= 100){//你也可以设置其他的值
timer.stop();
// w->showFullScreen();
w->show();
this->close();
}
});
//如果你是一个窗口,这里就是你的其他初始化代码,记得开线程运行会梗塞的代码QtConcurrent::run()、std::thread等等都可以
//在这里更新value的值(进度),需要自行看着调整value的变量范围,图省事直接设置全局也行
3、结束
大致的方案就是这样,效果图如下: