Есть ли круглый QProgressbar с диапазоном (0,0) в qt?

Я хочу иметь круглый QProgressbar, внешний вид которого должен выглядеть как обычный QProgressbar с диапазоном от 0 до 0.

Код для линейного QProgressbar выглядит примерно так:

QProgressBar *_progressBar = new QProgressBar();
_progressBar->setTextVisible(false);
_progressBar->setRange(0, 0);

введите здесь описание изображения

но я хочу, чтобы он был круглым. Есть ли способ реализовать это в qt?


person s.m    schedule 02.04.2016    source источник
comment
Вы имеете в виду как это?   -  person Ivan Aksamentov - Drop    schedule 02.04.2016
comment
Я имею в виду, что он круговой, и он вращается справа налево и начинается снова. это не имеет значения. @Уронить   -  person s.m    schedule 02.04.2016
comment
Затем это . В любом случае воспользуйтесь поиском и/или прочитайте Документацию. Удачного кодирования!   -  person Ivan Aksamentov - Drop    schedule 02.04.2016
comment
Это не индикатор выполнения, а индикатор занятости.   -  person dtech    schedule 02.04.2016
comment
Насколько мне известно, в Qt нет стандарта, но он должен быть достаточно простым, чтобы реализовать его на основе QProgressbar.   -  person Jesper Juhl    schedule 02.04.2016


Ответы (1)


Однажды я написал простой класс для реализации кругового индикатора выполнения для моих целей (Qt 4.6). Вы можете изменить его внешний вид по своему усмотрению. Надеюсь, это поможет.

загрузка.ч

#pragma once

#include <QtGui>

class Loading : public QWidget {
    Q_OBJECT
public:
    explicit Loading(QWidget *parent);

protected:
    double current;
    bool eventFilter(QObject *obj, QEvent *ev);
    bool event(QEvent *);
    void paintEvent(QPaintEvent *);
    void timerEvent(QTimerEvent *);
};

загрузка.cpp

#include "loading.h"

/**
 * @brief Creates a circular loading
 * @param parent - non-NULL widget that will be contain a circular loading
 */
Loading::Loading(QWidget *parent) : QWidget(parent), current(0) {
    Q_ASSERT(parent);
    parent->installEventFilter(this);
    raise();
    setAttribute(Qt::WA_TranslucentBackground);
    startTimer(20);
}

bool Loading::eventFilter(QObject *obj, QEvent *ev) {
    if (obj == parent()) {
        if (ev->type() == QEvent::Resize) {
            QResizeEvent * rev = static_cast<QResizeEvent*>(ev);
            resize(rev->size());
        }
        else if (ev->type() == QEvent::ChildAdded)
            raise();
    }
    return QWidget::eventFilter(obj, ev);
}

bool Loading::event(QEvent *ev) {
    if (ev->type() == QEvent::ParentAboutToChange) {
        if (parent()) parent()->removeEventFilter(this);
    }
    else if (ev->type() == QEvent::ParentChange) {
        if (parent()) {
            parent()->installEventFilter(this);
            raise();
        }
    }
    return QWidget::event(ev);
}

void Loading::paintEvent(QPaintEvent *) {
    QPainter p(this);
    p.fillRect(rect(), QColor(100, 100, 100, 64));

    QPen pen;
    pen.setWidth(12);
    pen.setColor(QColor(0, 191, 255));  // DeepSkyBlue
    p.setPen(pen);

    p.setRenderHint(QPainter::Antialiasing);

    QRectF rectangle(width()/2 - 40.0, height()/2 - 40.0, 80.0, 80.0);

    int spanAngle = (int)(qMin(0.2, current) * 360 * -16);
    int startAngle = (int)(qMin(0.0, 0.2 - current) * 360 * 16);

    p.drawArc(rectangle, startAngle, spanAngle);
}

void Loading::timerEvent(QTimerEvent *) {
    if (isVisible()) {
        current += 0.03;
        if (current > 1.2) current = 0.2; // restart cycle
        update();
    }
}

использование

#include "loading.h"

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    QLabel w;
    w.setMinimumSize(400, 400);
    Loading *loading = new Loading(&w);
    QTimer::singleShot(4000, loading, SLOT(hide()));
    w.show();
    return a.exec();
}
person Mitrakov Artem    schedule 28.06.2016