Как изменить цвет прогрессбара? Скажем, 40% для красного, 20% для зеленого, 40% для желтого и т. д. Я пытался использовать таблицы стилей, но обнаружил, что это работает только для плоских индикаторов выполнения, а не для 2D-баров.
Как получить эффект цилиндра (2D) Progress Bar с помощью программирования Qt?
Ответы (1)
Чтобы иметь возможность создать этот эффект, мы рисуем эллипс, для этого мы могли бы помочь нам из QPainterPath
придать ему форму, и мы поместили покрытие, которое является эллипсом, как показано ниже:
progressbar2d.h
#ifndef PROGRESSBAR2D_H
#define PROGRESSBAR2D_H
#include <QProgressBar>
class ProgressBar2D : public QProgressBar
{
Q_OBJECT
public:
ProgressBar2D(QWidget *parent = 0);
~ProgressBar2D();
protected:
void paintEvent(QPaintEvent *);
private:
void draw(QPainter *painter, QRect rect, int w);
void drawEllipticalRectangle(QPainter *painter, QRect rect, int w);
};
#endif // PROGRESSBAR2D_H
progressbar2d.cpp
#include "progressbar2d.h"
#include <QPainter>
ProgressBar2D::ProgressBar2D(QWidget *parent): QProgressBar(parent)
{
}
ProgressBar2D::~ProgressBar2D()
{
}
void ProgressBar2D::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
int borde = height()/10;
draw(&painter,
QRect(borde, borde, width()-2*borde, height()-2*borde),
2*borde);
painter.drawText(rect(), Qt::AlignCenter, QString("%1").arg(value()));
}
void ProgressBar2D::draw(QPainter *painter, QRect rect, int w)
{
int w_percentage = 2*w + value()*(rect.width()-2*w)/maximum();
painter->setBrush(QBrush(QColor("#81C253")));
drawEllipticalRectangle(painter,
QRect(rect.topLeft(), QSize(w_percentage, rect.height()) ),
w);
painter->setBrush(QBrush(QColor("#C3DDB1")));
drawEllipticalRectangle(painter,
QRect(QPoint(rect.topLeft() + QPoint(w_percentage-2*w, 0)),
QSize(rect.width()-w_percentage+2*w, rect.height()) ),
w);
painter->setBrush(QBrush(QColor("#77896C")));
painter->drawEllipse(QRect( rect.topLeft() + QPoint(rect.width()-2*w, 0) , QSize(2*w, rect.height())));
}
void ProgressBar2D::drawEllipticalRectangle(QPainter *painter, QRect rect, int w)
{
painter->translate(rect.topLeft());
QPainterPath path;
path.moveTo(w, 0);
path.arcTo(QRectF(0, 0, 2*w, rect.height()), 90, 180);
path.lineTo(rect.width()-w, rect.height());
path.arcTo(QRectF(rect.width()-2*w, 0, 2*w, rect.height()), 270, -180);
path.lineTo(w, 0);
painter->drawPath(path);
painter->translate(-rect.topLeft());
}
main.cpp
#include "progressbar2d.h"
#include <QApplication>
#include <QTimer>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ProgressBar2D w;
QTimer *timer = new QTimer(&w);
QObject::connect(timer, &QTimer::timeout, [&w](){
w.setValue((w.value()+1)%(1 + w.maximum()));
});
timer->start(100);
w.show();
return a.exec();
}
person
eyllanesc
schedule
25.07.2017
Я могу сказать, что смотрю это уже две минуты подряд, это действительно гипнотизирует. Теперь мне нужны только цилиндрические индикаторы выполнения.
- person Matteo Italia; 26.07.2017
Я не понимаю. :П
- person eyllanesc; 26.07.2017
@eyllanesc: как изменить размер окна? setFixedSize здесь не работает
- person Ques; 27.07.2017
Какое окно, я не понимаю?
- person eyllanesc; 27.07.2017
@eyllanesc: я не понял эту строку в вашем коде, int w_percentage = 2*w + value()*(rect.width()-2*w)/maximum(), не могли бы вы рассказать мне об этом?
- person Ques; 27.07.2017
Какая линия? поясните лучше пожалуйста.
- person eyllanesc; 27.07.2017
Я имею в виду главное окно
- person Ques; 27.07.2017
Если вы понимаете, что покрытия представляют собой эллипсы высоты h и ширины w.
- person eyllanesc; 27.07.2017
В progressbar2d.cpp внутри draw() есть эта строка int w_percentage = 2*w + value()*(rect.width()-2*w)/maximum()
- person Ques; 27.07.2017
Если вы инкапсулируете цилиндр в прямоугольник, это прямоугольник, переданный функции рисования, а ширина эллипсов на боковых гранях равна w.
- person eyllanesc; 27.07.2017
Часть, которая показывает процент, должна закрасить часть цилиндра, и это расчет, чтобы узнать, какую часть закрасить, с небольшой геометрией, которую вы можете понять.
- person eyllanesc; 27.07.2017
QProgressBar
a> и перегрузите метод рисования. 2. Вы можете создать собственныйQStyle
где вы переопределяете рендеринг индикатора выполнения. - person Scheff's Cat   schedule 21.07.2017