Ich sehe nicht, was das Problem hier ist, können Sie QPainterPath
verwenden und einen vollständigen oder teilweisen Bogenpfad zu ihm hinzufügen, dann zeichnen Sie den Pfad über QPen
mit einem Qt::DotLine
Stil.
Wenn die Aktie gepunktete Linie für Sie nicht funktioniert, gibt es die Möglichkeit zu specify a custom pattern über:
void QPen::setDashPattern(const QVector<qreal> & pattern)
Hier ist ein kleines Beispiel, wie folgt aussehen:
class CPBar : public QWidget {
Q_OBJECT
qreal p; // progress 0.0 to 1.0
public:
CPBar(QWidget * p = 0) : QWidget(p), p(0) {
setMinimumSize(208, 208);
}
void upd(qreal pp) {
if (p == pp) return;
p = pp;
update();
}
void paintEvent(QPaintEvent *) {
qreal pd = p * 360;
qreal rd = 360 - pd;
QPainter p(this);
p.fillRect(rect(), Qt::white);
p.translate(4, 4);
p.setRenderHint(QPainter::Antialiasing);
QPainterPath path, path2;
path.moveTo(100, 0);
path.arcTo(QRectF(0, 0, 200, 200), 90, -pd);
QPen pen, pen2;
pen.setCapStyle(Qt::FlatCap);
pen.setColor(QColor("#30b7e0"));
pen.setWidth(8);
p.strokePath(path, pen);
path2.moveTo(100, 0);
pen2.setWidth(8);
pen2.setColor(QColor("#d7d7d7"));
pen2.setCapStyle(Qt::FlatCap);
pen2.setDashPattern(QVector<qreal>{0.5, 1.105});
path2.arcTo(QRectF(0, 0, 200, 200), 90, rd);
pen2.setDashOffset(2.2);
p.strokePath(path2, pen2);
}
};
class Test : public QWidget {
Q_OBJECT
public:
Test() {
QVBoxLayout * l = new QVBoxLayout(this);
CPBar * p = new CPBar;
QSlider * s = new QSlider(Qt::Horizontal, this);
s->setMinimum(0);
s->setMaximum(100);
l->addWidget(p);
l->addWidget(s);
setLayout(l);
connect(s, &QSlider::valueChanged, [=](){ p->upd((qreal)s->value()/s->maximum());});
}
};
was ist der zweite kreisförmige progressbar? – eyllanesc
@eyllanesc Ausgebrütet kreisförmig ... im Bild. Unter blau progressbar – elgolondrino
Bitte poste relevanten Code oder, vorzugsweise, ein [minimales, komplettes und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve). –