2017-03-14 1 views
0

위젯의 paintEvent을 무시하면서 순환 진행 바를 qt에서 수행 할 수 있고 순환 진행 바를 그릴 수 있지만 두 번째 순환 진행 바 (다음과 같이 그릴 수 없음)를 사용하면 주 원형 진행 바 뒤에 어려움이 있습니다.Qt의 사용자 정의 원형 진행 바

enter image description here

아무도 나를 통해 안내 할 수 있습니까? 미리 감사드립니다.

+0

두 번째 순환 진행률 막대는 무엇입니까? – eyllanesc

+0

@eyllanesc 이미지에서 원형으로 부화 .... 파란색 진행 바 아래 – elgolondrino

+0

관련 코드 또는 선호하는 [최소, 완전하고 검증 가능한 예제] (http://stackoverflow.com/help/mcve)를 게시하십시오. –

답변

1

여기에서 문제가 보이지 않습니다. QPainterPath을 사용하고 전체 또는 부분 아크 경로를 추가 한 다음 Qt::DotLine 스타일을 사용하여 QPen 경로를 그립니다.

enter image description here

: 여기

void QPen::setDashPattern(const QVector<qreal> & pattern) 
이처럼 보이는, 빠른 예입니다

주식 점선이 당신을 위해 작동하지 않는 경우

을 통해 specify a custom pattern에 대한 옵션이 있습니다
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

그 전에 시도했지만 그게 내가 원하는 게 아니야 – elgolondrino

+0

이것은 이미지의 결과를 얻는 방법입니다. – dtech

+0

'dashedPattern' 만 사용했지만 360에서 일부 서클을주었습니다. 그들은 예상보다 컸습니다. – elgolondrino