进度条颜色

Adi*_*med 3 css c++ qt

我需要QProgressBar更改特定值的颜色,例如

  • 0-60 整数部分:绿色
  • 60-80 Int : 橙色
  • 80-100 整数 : 红色

但我找不到解决方案。从样式表中,进度条的整体颜色会随着值的变化而变化,但不会按部分变化。

我正在使用QT creator 3.4.0基于QT 5.4.1.

Mik*_*iki 5

你可以用这样的样式表来做到这一点:

QProgressBar* bar = new QProgressBar();
bar->setStyleSheet("::chunk {"
                   "background-color: "
                   "qlineargradient(x0: 0, x2: 1, "
                   "stop: 0 green, stop: 0.6 green, "
                   "stop: 0.60001 orange, stop: 0.8 orange, "
                   "stop: 0.80001 red, stop: 1 red"
                   ")}");
Run Code Online (Sandbox Code Playgroud)

它看起来像这样:

在此处输入图片说明

您可以简单地应用它使其更顺畅:

 bar->setStyleSheet("::chunk {"
                    "background-color: "
                    "qlineargradient(x0: 0, x2: 1, "
                    "stop: 0 green, stop: 0.6 green, "
                    "stop: 0.8 orange, "
                    "stop: 1 red"
                    ")}");
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

更新:

这个解决方案是不正确的,因为值小于最大值,你会得到这样的东西:

在此处输入图片说明

正如其他人所指出的,这里是:QProgressBar 中块的梯度

唯一的解决方案似乎是自定义 paintEvent

更新2:

为了完整起见,这里是自定义paintEvent的相关代码。这会起作用,但看起来不太好。此外,大多数参数应该是类成员并由用户设置。然而:

彩色进度条.h

#ifndef COLOREDPROGRESSBAR_H
#define COLOREDPROGRESSBAR_H

#include <QWidget>
#include <QProgressBar>
#include <QPaintEvent>

class ColoredProgressBar : public QProgressBar
{
    Q_OBJECT
public:
    explicit ColoredProgressBar(QWidget *parent = 0);
    ~ColoredProgressBar();

protected:

    void paintEvent(QPaintEvent*) Q_DECL_OVERRIDE;

signals:

public slots:
};

#endif // COLOREDPROGRESSBAR_H
Run Code Online (Sandbox Code Playgroud)

彩色进度条.cpp

#include "coloredprogressbar.h"

#include <QPainter>
#include <QBrush>
#include <QStyle>
#include <QPen>
#include <QColor>

ColoredProgressBar::ColoredProgressBar(QWidget *parent) : QProgressBar(parent)
{

}

ColoredProgressBar::~ColoredProgressBar()
{

}

void ColoredProgressBar::paintEvent(QPaintEvent*)
{
    int val = value();
    int pos = QStyle::sliderPositionFromValue(minimum(), maximum(), val, width());

    int pos60 = QStyle::sliderPositionFromValue(minimum(), maximum(), 60, width());
    int pos80 = QStyle::sliderPositionFromValue(minimum(), maximum(), 80, width());

    QPainter p(this);
    p.setPen(Qt::green);
    p.setBrush(QBrush(Qt::green));

    if(val >= 0 && val <= 60)
    {
        p.drawRect(0,0,pos,height());
    }
    else if(val > 60 && val <= 80)
    {
        p.drawRect(0,0,pos60,height());
        p.setPen(QColor(255,127,0));
        p.setBrush(QBrush(QColor(255,127,0)));
        p.drawRect(pos60, 0, pos - pos60, height());
    }
    else
    {
        p.drawRect(0,0,pos60,height());
        p.setPen(QColor(255,127,0));
        p.setBrush(QBrush(QColor(255,127,0)));
        p.drawRect(pos60, 0, pos80 - pos60,height());
        p.setPen(Qt::red);
        p.setBrush(QBrush(Qt::red));
        p.drawRect(pos80, 0, pos - pos80, height());
    }

    p.setPen(Qt::lightGray);
    p.setBrush(QBrush(Qt::lightGray));
    p.drawRect(pos, 0, width(), height());


    p.setPen(Qt::black);
    p.setBrush(QBrush(Qt::black));
    p.drawText(0,0, width(), height(), Qt::AlignCenter, QString::number(val) + "%");
}
Run Code Online (Sandbox Code Playgroud)

用法

#include <QApplication>
#include "coloredprogressbar.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    ColoredProgressBar bar;
    bar.setValue(85);
    bar.show();

    return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

我再说一遍,这只是一个简单的实现,看起来不太好并且缺少一些用户可设置的功能,但可以作为一个起点。随意编辑此代码。