循环进度指示

sch*_*eda 7 c++ qt

我正在寻找一个循环进度指示Widget for Qt5,如下所示:http://anthonyterrien.com/knob/

在Qt中是否有类似的东西或可以做到这一点?

我想手动设置百分比,它不应该是一个旋转的圆圈或类似的东西

Che*_*byl 16

写起来很容易.你需要特殊paintEvent()和插槽setProgress().当然,如果你想增加更多美感,那么你需要花一些时间,但这里有一个例子:

标题:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPaintEvent>

class Widget : public QWidget
{
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = 0);

signals:

public slots:
    void setProgress(int val);

protected:
    void paintEvent(QPaintEvent *);

private:
    double progress;

};

#endif // WIDGET_H
Run Code Online (Sandbox Code Playgroud)

CPP:

void Widget::setProgress(int val)
{
    progress = (double)val/100;
    //yes, it is not very good, the best approach is to
    //create something similar to QProgressBar
    this->update();
}


void Widget::paintEvent(QPaintEvent *)
{
    QPainter p(this);

    QPen pen;
    pen.setWidth(7);
    pen.setColor(Qt::red);
    p.setPen(pen);

    p.setRenderHint(QPainter::Antialiasing);

    QRectF rectangle(10.0, 20.0, 80.0, 80.0);
    //to understand these magic numbers, look drawArc method in Qt doc
    int startAngle = -90 * 16;
    int spanAngle = progress * 360 * 16;

    p.drawArc(rectangle, startAngle, spanAngle);

    p.drawText(rectangle,Qt::AlignCenter,QString::number(progress*100)+" %");
}
Run Code Online (Sandbox Code Playgroud)

用法:

Widget wd; 
wd.show();
QSlider sl;
sl.show();

QObject::connect(&sl,SIGNAL(valueChanged(int)),&wd,SLOT(setProgress(int)));
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述

我在这里表现出的主要想法,但我认为我的代码可以改进,例如添加方法setMinimum/MaximumsetValue,如QProgressBar,但我希望你能添加额外的功能,如果手动你需要这个.