2017-03-14 13 views
0

Ich bin in der Lage, kreisförmige Fortschrittsbalken in qt während des Überschreibens paintEvent des Widgets zu machen und kreisförmige Fortschrittsbalken zu zeichnen, aber eine Schwierigkeit mit dem zweiten kreisförmigen Fortschrittsbalken (nicht in der Lage, so zu zeichnen) hinter Haupt kreisförmigen Fortschrittsbalken:Benutzerdefinierte kreisförmige Fortschrittsbalken in Qt

enter image description here

Kann jemand mich leiten durch? Danke im Voraus.

+0

was ist der zweite kreisförmige progressbar? – eyllanesc

+0

@eyllanesc Ausgebrütet kreisförmig ... im Bild. Unter blau progressbar – elgolondrino

+0

Bitte poste relevanten Code oder, vorzugsweise, ein [minimales, komplettes und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve). –

Antwort

1

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:

enter image description here

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

Ich habe es vorher versucht, aber das ist nicht was ich will – elgolondrino

+0

So erreichen Sie das Ergebnis aus dem Bild. – dtech

+0

Ich habe nur 'stridgedPattern' verwendet, aber es gab mir einige Kreise in 360. Sie waren größer als ich erwartet hatte – elgolondrino

Verwandte Themen