I know this is an old question, but I came across it a few days ago, and I think I have a solution. You want to create a conical gradient and fix the drive that you want to use as a round loading bar. Here is an example:
widget.h:
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> class QPaintEvent; class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); void setLoadingAngle(int loadingAngle); int loadingAngle() const; void setDiscWidth(int width); int discWidth() const; protected: void paintEvent(QPaintEvent *); private: int m_loadingAngle; int m_width; }; #endif // WIDGET_H
widget.cpp:
#include "widget.h" #include <QPaintEvent> #include <QPainter> #include <QConicalGradient> #include <QPen> Widget::Widget(QWidget *parent) : QWidget(parent), m_loadingAngle(0), m_width(0) { } Widget::~Widget() { } void Widget::setLoadingAngle(int loadingAngle) { m_loadingAngle = loadingAngle; } int Widget::loadingAngle() const { return m_loadingAngle; } void Widget::setDiscWidth(int width) { m_width = width; } int Widget::discWidth() const { return m_width; } void Widget::paintEvent(QPaintEvent *) { QRect drawingRect; drawingRect.setX(rect().x() + m_width); drawingRect.setY(rect().y() + m_width); drawingRect.setWidth(rect().width() - m_width * 2); drawingRect.setHeight(rect().height() - m_width * 2); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); QConicalGradient gradient; gradient.setCenter(drawingRect.center()); gradient.setAngle(90); gradient.setColorAt(0, QColor(178, 255, 246)); gradient.setColorAt(1, QColor(5, 44, 50)); int arcLengthApproximation = m_width + m_width / 3; QPen pen(QBrush(gradient), m_width); pen.setCapStyle(Qt::RoundCap); painter.setPen(pen); painter.drawArc(drawingRect, 90 * 16 - arcLengthApproximation, -m_loadingAngle * 16); }
main.cpp:
#include "widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.setDiscWidth(20); w.setLoadingAngle(270); w.show(); return a.exec(); }
And the result:

Of course, this is not a complete and accurate solution, but I think that this is all you need to know in order to achieve what you want. The remaining details are not difficult to implement.
Iuliu
source share