实现一个进度条对话框

效果如下:

点击按钮后开启1个线程模拟加载什么东西,同时弹出1个进度条对话框,进度条达到最大值后,进度条对话框慢慢变透明然后消失

 关键点是我们要在进度条类中添加1个槽函数,在这个槽函数中设置进度条的值

代码如下:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QDialog>
#include<QProgressBar>
#include<QPushButton>
#include<QHBoxLayout>
#include<QThread>
#include<QEventLoop>


//进度条对话框类
class ProgressBarDialog:public QDialog
{
    Q_OBJECT
public:
    ProgressBarDialog(QWidget *parent = nullptr):QDialog(parent)
    {
        //设置固定大小
        setFixedSize(300,200);

        //1、去掉标题栏
        setWindowFlag(Qt::FramelessWindowHint);
        //2、设置背景透明
        setAttribute(Qt::WA_TranslucentBackground);
        //对话框关闭即销毁释放内存
        setAttribute(Qt::WA_DeleteOnClose);

        //添加填充widget
        QHBoxLayout* h_box=new QHBoxLayout(this);
        h_box->setSpacing(0);
        h_box->setContentsMargins(0,0,0,0);

        QWidget* w=new QWidget(this);
        h_box->addWidget(w);

        //设置圆角和渐变背景色
        w->setStyleSheet(R"(.QWidget{border-radius:10px;
             background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
            stop:0 rgba(255, 255, 255, 0),
            stop:0.5 rgba(255, 0, 0, 255),
            stop:1 rgba(255, 255, 255, 0));})");

        //创建进度条并添加到w中
        m_progress=new QProgressBar(w);
        m_progress->setRange(0,100);
        m_progress->setValue(0);
        m_progress->setOrientation(Qt::Horizontal);
        m_progress->setStyleSheet(R"(QProgressBar {
border: 2px solid grey;
border-radius: 5px;
background-color: #FFFFFF;
}
QProgressBar::chunk {
background-color: #05B8CC;
width: 20px;
}
QProgressBar {
text-align: center;
color: rgb(255, 85, 0);
})");

        QHBoxLayout* h_box2=new QHBoxLayout(w);
        h_box2->addWidget(m_progress);

    }
    ~ProgressBarDialog()=default;
public slots:
    //添加槽函数,该槽函数中会更新进度条的进度,
    //而且当进度条完成时,对话框会退出并且附带渐退的效果
    void UpdateProgress(int current_progess)
    {
        m_progress->setValue(current_progess);
        if(current_progess>=m_progress->maximum())
        {
            //变透明的整个过程持续0.5s
            for(int i=100;i>=0;--i)
            {
                //设置窗口变透明
                setWindowOpacity(i/100.0);
                QThread::msleep(5);

                //防止msleep导致其他更新操作不会立即更新,比如设置标题啊,图标啊等等
                QEventLoop loop;
                loop.processEvents();
            }
            close();
        }
    }
private:
    QProgressBar* m_progress;
    QWidget* w;

};

//创建1个测试类,这个类继承自线程类,
//在这个测试类中模拟进行的操作,线程开启后每隔一段时间就会发出当前进度的信号
class Test:public QThread
{
    Q_OBJECT
public:
    //使用父类的构造函数
    using QThread::QThread;
    ~Test()=default;
protected:
    void run() override
    {
        for(int i=0;i<=100;++i)
        {
            //模拟操作
            msleep(70);

            //通知该操作的进度
            emit currentProgress(i);
        }
    }
signals:
    void currentProgress(int current_progress);
};


//主窗口类
class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr): QWidget(parent)
    {
        resize(500,300);
        m_btn=new QPushButton("点击加载配置",this);
        m_btn->setGeometry(20,20,100,50);

        connect(m_btn,&QPushButton::clicked,this,[=](){
            //创建操作线程
            Test* test=new Test(this);
            //创建对话框
            ProgressBarDialog* d=new ProgressBarDialog(this);
            //绑定信号槽
            connect(test,&Test::currentProgress,d,&ProgressBarDialog::UpdateProgress);

            //开启线程
            test->start();
            d->exec();
        });
    }
    ~Widget()=default;
private:
    QPushButton* m_btn;
};
#endif // WIDGET_H

学习链接:https://github.com/0voice

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值