Улучшение производительности пользовательской анимации индикатора выполнения

Я ищу настраиваемый индикатор выполнения, прогресс которого изменяется с помощью пользовательской анимации. У меня будет довольно много экземпляров этого виджета, и все они должны работать гладко и быстро.

Моей первой попыткой было использовать обычный QProgressBar, настроить его с помощью таблицы стилей, а затем использовать QPropertyAnimation для анимации изменения статуса.

Это работает нормально, но очень медленно. Скажем, я начинаю свою анимацию со значения 0% и дохожу до 50% и хочу, чтобы это было выполнено в течение 500 мс. Он совсем не гладкий, а есть три четко различимые ступени. Если я брошу таблицу стилей, она будет работать достаточно плавно.


person IceFire    schedule 16.05.2016    source источник


Ответы (1)


Хорошо, кажется, что работает нормально использование производного класса QProgressBar, это намного быстрее, чем использование таблиц стилей, хотя мне нужно настроить ширину и высоту на заказ:

void ColorBar::paintEvent(QPaintEvent *pe)
{
    QRect region = pe->rect();
    QPainter painter(this);

    QColor borderColor;
    borderColor.setNamedColor("#a0a0a0");
    QColor lightColor = QColor(255, 255, 255);
    QColor darkColor = QColor(225, 225, 225);

    int barHeight = static_cast<int>(height() * 1. / 4. + 0.5);

    QRect drawRect(0, static_cast<int>(height() / 2. - barHeight / 2. + 0.5), width() * .9 * value() / maximum(), barHeight);

    QLinearGradient g(drawRect.topLeft(), drawRect.bottomLeft());
    g.setColorAt(0., lightColor);
    g.setColorAt(1., darkColor);

    painter.setPen(QPen(borderColor));
    painter.setBrush(QBrush(g));

    painter.drawRect(drawRect);
}

Затем анимация этой панели становится простой и быстрой:

        QPropertyAnimation* x = new QPropertyAnimation(percentageBar, "value");
        x->setStartValue(percentageBar->value());
        x->setEndValue(newValue);
        x->setDuration(500);
        x->start();

Все еще открыты для обратной связи или лучших решений!

person IceFire    schedule 16.05.2016
comment
Это небольшое улучшение, но кэширование ваших цветов и QLinearGradient немного ускорит реализацию paintEvent. - person anonymous; 16.05.2016