QT (C++) 进度条的实现

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、结束

大致的方案就是这样,效果图如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值