我在一个项目中,要从文件将数据导入到数据库中,由于导入数据量大,在导入的过程中,有时候进度条会停留在0%大概半分钟之久,如果没有动态提示的话,用户很可能误认为该软件已经死了。所以我在进度条上显示“数据正在加载中,请稍后。。。”的动态显示。这样用户就不会认为程序死了。
#include "myprocessbar.h"
#include <QStyleOptionProgressBar>
#include <QPainter>
#include <QTimer>
MyProcessBar::MyProcessBar(QWidget *parent) : QProgressBar (parent)
{
m_timer =new QTimer(this);
this->setAlignment(Qt::AlignTrailing);
this->setTextVisible(false);
this->setStyleSheet("QProgressBar{height:20px;border-radius:10px;}\
QProgressBar::chunk{border-radius:10px;background-color:#05B8CC;} ");
connect(m_timer,&QTimer::timeout,[this](){
int _value =this->value();
if(_value!=0)
{
if(m_currvalue >= _value)
m_currvalue=0;
m_currvalue++;
this->repaint();
}
else {
this->repaint();
}
});
m_timer->start(50);
}
void MyProcessBar::setRange(int minimum, int maximum)
{
m_maxvalue=maximum;
QProgressBar::setRange(minimum,maximum);
}
void MyProcessBar::paintEvent(QPaintEvent *e)
{
QProgressBar::paintEvent(e);
QStyleOptionProgressBar opt;
initStyleOption(&opt);
if (m_currvalue != 0)
{
QPainter painter(this);
QRect rect1 = style()->subElementRect(QStyle::SE_ProgressBarContents, &opt, this);
//QRectF rect1=this->rect();
double _width=static_cast<double>(m_currvalue)/static_cast<double>(m_maxvalue)*rect1.width();
QLinearGradient gradient(0,0,_width,rect1.height());
gradient.setColorAt(0,Qt::red);
gradient.setColorAt(1,Qt::blue);
painter.setBrush(gradient);
QRectF rect2=QRectF(rect1.topLeft(),QSize(static_cast<int>(_width),static_cast<int>(rect1.height())));
rect2.adjust(0,0.8,0,-2);
painter.drawRoundedRect(rect2, 10, 10);
//painter.drawRect(rect);
painter.drawText(QPointF(rect1.width()/2.0,rect1.height()/1.5),QString("%1%").arg(this->value()));
}
else
{
QPainter painter(this);
QRect rect1 = style()->subElementRect(QStyle::SE_ProgressBarContents, &opt, this);
static int num = 0;
double _width = this->width();
switch ((num++)%3) {
case 0:
painter.drawText(QPointF(_width/3.0,rect1.height()/1.5),"正在努力加载中,请稍后。");
break;
case 1:
painter.drawText(QPointF(_width/3.0,rect1.height()/1.5),"正在努力加载中,请稍后。。");
break;
case 2:
painter.drawText(QPointF(_width/3.0,rect1.height()/1.5),"正在努力加载中,请稍后。。。");
break;
}
}
}