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

如下图所示:

效果如下:

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

介绍

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

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

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

代码如下

ProgressBar.h:

#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:

#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()));
}

原文地址:https://www.cnblogs.com/lifexy/p/9193109.html

时间: 2024-08-28 07:45:23

27.QT-QProgressBar动态实现多彩进度条(详解)的相关文章

Bootstrap 各种进度条详解

一:默认的进度条 创建一个基本的进度条的步骤如下: 添加一个带有 class .progress 的 <div>. 接着,在上面的 <div> 内,添加一个带有 class .progress-bar 的空的 <div>. 添加一个带有百分比表示的宽度的 style 属性,例如 style="60%"; 表示进度条在 60% 的位置. 让我们看看下面的实例: <!DOCTYPE html> <html> <head>

两种CSS3圆环进度条详解

晚上睡觉之前,我抽了1个多小时,研究了一下圆环进度条,结合从网上查阅的资料,我终于掌握了两种圆环的生成方法. 这次的效果就是单纯的CSS3效果,也没有写具体的JS,等以后有时间在好好整理一下吧~. 第一种:通过overflow溢出隐藏的方式: 这种方法好处在于容易理解,只需要一层一层的嵌套,即可得到效果,但是实现起来较为繁琐,HTML的结构也比较冗余. 先看HTML结构: <div class="circle-one"> <div class="circle

Qt编写自定义控件13-多态进度条

前言 多态进度条,顾名思义,有多重状态,其实本控件主要是用来表示百分比进度的,由于之前已经存在了百分比进度条控件,名字被霸占了,按照先来先得原则,只好另外取个别名叫做多态进度条,应用场景是,某种任务有三种状态,比如正常状态.警戒状态.报警状态,这三种状态都分别有一个占比,需要用不同的颜色表示,这样就衍生出了此控件,类似于堆积图.接下来节假日四天,可以全身心投入研发还未完工的大屏UI程序,基础控件部分+二级界面部分都已经做好,现在专心整合到主界面和打通数据流(采用数据库采集+网络采集两种方式).多

Qt编写自定义控件14-环形进度条

前言 环形进度条,用来展示当前进度,为了满足大屏UI的需要特意定制,以前有个叫圆环进度条,不能满足项目需要,只能重新定做,以前的进度间距不能自适应分辨率,而且当前进度对应的反的进度不能单独设置颜色,即当前进度90%,剩余的10%也需要设置成不同的颜色,还有一个重要的功能是,能够指定多个警戒值,一旦超过或者小于该值,则当前进度自动切换到预先设定的警戒值颜色,而不需要用户自己去判断警戒值去设置警戒颜色,用户只需要传入当前值即可,这个功能非常实用,还可以设置警戒判断的标准是超过值还是小于值报警.个人感

动态上下线集群详解

动态上下线集群的一些配置: 1.namenode中 hdfs-site.xml 配置 <property> <name>dfs.hosts</name> <value>/ddmap/hadoop-1.0.4/conf/hdfs_include</value> </property> <property> <name>dfs.hosts.exclude</name> <value>/ddm

《Java基础知识》动态代理(InvocationHandler)详解

1. 什么是动态代理 对象的执行方法,交给代理来负责.比如user.get() 方法,是User对象亲自去执行.而使用代理则是由proxy去执行get方法. 举例:投资商找明星拍广告,投资商是通过经纪人联系的,经纪人可以帮明星接这个广告,也可以拒绝.做不做,怎么做都叫给经纪人和投资商谈. 2. 实际场景应用 2.1 校验用户权限,每一个菜单请求,都要判断一下请求的用户是否有该菜单权限.菜单多了,代码冗余,且容易遗漏. 通过动态代理就可以实现为:每一个用户,每一个菜单的请求,都经过代理(proxy

2015年8月27日课程作业(grep,正则表达式详解)

一.作业(练习)内容: 1.总结本此课程中所涉及命令的使用方法及相关示例展示  grep: 文本搜索工具,根据用户指定的文本模式(正则表达元字符及正常字符组成而成)对目标文件进行逐行搜索,显示匹配的行 grep [OPTIONS]... [PATTERN] [FILENAME]... --color=auto    #对匹配到的字符串作高亮显示 -i       #忽略大小写 -v       #仅显示匹配不到行 -O       #仅显示匹配到的字符串 -q       #静默模式 -E  

2016/3/27 PHP中include和require的区别详解

1.概要 require()语句的性能与include()相类似,都是包括并运行指定文件.不同之处在于:对include()语句来说,在执行文件时每次都要进行读取和评估:而对于require()来说,文件只处理一次(实际上,文件内容替换require()语句).这就意味着如果可能执行多次的代码,则使用require()效率比较高.另外一方面,如果每次执行代码时是读取不同的文件,或者有通过一组文件迭代的循环,就使用include()语句. require的使用方法如:require("myfile

ExtJs--03--几个进度条代码,可以看看

/* * //通过固定时间完成进度条,即:伪进度条 Ext.onReady(function () { var progressBar = Ext.Msg.show({ title: "进度条", msg: "通过固定时间完成进度", width: 300, wait: true, waitConfig: { interval: 500, duration: 5000, fn: function () { Ext.Msg.hide(); } }, closable: