2017-03-14 2 views
0

Je peux faire une barre de progression circulaire en qt tout en remplaçant paintEvent du widget et dessiner une barre de progression circulaire mais ayant des difficultés avec la deuxième barre de progression circulaire (impossible de dessiner comme ça) derrière la barre de progression circulaire principale:Barre de progression circulaire personnalisée dans Qt

enter image description here

Quelqu'un peut-il me guider à travers? Merci d'avance.

+0

quelle est la deuxième barre de progression circulaire? – eyllanesc

+0

@eyllanesc Haché circulaire ... dans l'image. Sous barre de progression bleue – elgolondrino

+0

Veuillez poster un code pertinent ou, de préférence, un [exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve). –

Répondre

1

Je ne vois pas quel est le problème ici, vous pouvez utiliser QPainterPath et y ajouter un chemin d'arc complet ou partiel, puis dessiner le chemin via QPen en utilisant un style Qt::DotLine.

Si la ligne pointillée d'actions ne fonctionne pas pour vous, il y a la possibilité de specify a custom pattern via:

void QPen::setDashPattern(const QVector<qreal> & pattern) 

Voici un exemple rapide, qui ressemble à ceci:

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

J'ai essayé avant cela mais ce n'est pas ce que je veux – elgolondrino

+0

Voici comment vous obtenez le résultat de l'image. – dtech

+0

Je n'ai utilisé que 'dashedPattern' mais cela m'a donné quelques cercles en 360. Ils étaient plus grands que ce à quoi je m'attendais – elgolondrino