效果如下:
点击按钮后开启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