前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >27.QT-QProgressBar动态实现多彩进度条(详解)

27.QT-QProgressBar动态实现多彩进度条(详解)

作者头像
诺谦
发布2018-07-31 11:00:26
2.1K0
发布2018-07-31 11:00:26
举报
文章被收录于专栏:Linux驱动Linux驱动

如下图所示:

效果如下:

(gif录制的动画效果不好,所以颜色有间隙)

介绍

通过qss实现,只需要一个多彩背景图,通过QImage获取颜色,然后来设置进度条,便可以实现动态多彩进度条(根据图片设定颜色)

其中,上面3个进度条就是通过以下3个图片实现的:

如果想实现其它颜色,只需要改图片即可

代码如下

ProgressBar.h:

代码语言:javascript
复制
#ifndef PROGRESSBAR_H
#define PROGRESSBAR_H
#include <QtGui>

class ProgressBar : public QWidget
{
    Q_OBJECT

    QProgressBar m_bar;
    QLabel       m_value;
    QSlider      m_slider;
    QImage       m_image;

protected slots:
    void  onvalueChanged(int value);
public:
    explicit ProgressBar(const QString&  fileName,QWidget *parent = 0);  
};

#endif // PROGRESSBAR_H

ProgressBar.cpp:

代码语言:javascript
复制
#include "ProgressBar.h"

ProgressBar:: ProgressBar(const QString&  fileName,QWidget *parent ) :
    QWidget(parent),
    m_bar(this),
    m_value(this),
    m_slider(this),
    m_image(fileName)
{

    m_bar.setMaximum(100);
    m_bar.setMinimum(0);
    m_bar.setValue(0);
    m_bar.setTextVisible(false);
    m_bar.setFixedHeight(20);

    m_slider.setMaximum(100);
    m_slider.setMinimum(0);
    m_slider.setValue(0);
    m_slider.setOrientation(Qt::Horizontal);

    m_value.setText(QString("%1%").arg(m_bar.value()));
    m_value.setAlignment(Qt::AlignRight|Qt::AlignVCenter);
    m_value.setMinimumWidth(40);

     /*设置布局*/
     QHBoxLayout* hlayout = new QHBoxLayout();
     hlayout->addWidget(&m_slider);
     hlayout->addWidget(&m_value,0,Qt::AlignRight);

     QVBoxLayout* vlayout = new QVBoxLayout();

     vlayout->addWidget(&m_bar);
     vlayout->addLayout(hlayout);
     setLayout(vlayout);

     connect(&m_slider,SIGNAL(valueChanged ( int)),&m_bar,SLOT(setValue (int)));
     connect(&m_bar,SIGNAL(valueChanged ( int)),this,SLOT(onvalueChanged (int)));

     onvalueChanged(m_bar.value());
}
void ProgressBar::onvalueChanged(int value)
{
    QString qss= "QProgressBar{"
               "border: 1px solid rgb(16, 135, 209);"
               "background: rgba(248,248,255,180);"
               "border-radius: 6px; }"
               "QProgressBar::chunk:enabled {"
               "border-radius: 4px; "
               "background: qlineargradient(x1:0, y1:0, x2:1, y2:0" ;

    double v = m_bar.maximum();
    double EndColor=static_cast<double>(value)/v ;    //获取比例

    for(int i=0;i<100;i++)
    {
     double Current = EndColor*i/100;
     QRgb rgb = m_image.pixel((m_image.width()-1)*Current,m_image.height()/2);
     QColor c(rgb);
     qss.append(QString(",stop:%1  rgb(%2,%3,%4)").arg(i/100.0).arg(c.red()).arg(c.green()).arg(c.blue()));
    }

    qss.append(");}");
    m_bar.setStyleSheet(qss);
    m_value.setText(QString("%1%").arg(m_bar.value()));
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-06-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档