Qt Custom ProgressBar не может обновляться (paintEvent)

я создал собственный индикатор выполнения, но когда я вызываю метод SetValue(), метод paintEvent ( override) не вызывается, поэтому индикатор выполнения показывает только самое первое значение.

Это заголовок grafica_progressbar.h

    #ifndef GRAFICA_PROGRESSBAR_H
    #define GRAFICA_PROGRESSBAR_H

    #include <QWidget>
    #include <QProgressBar>
    #include <QPaintEvent>

    #include <QPainter>
    #include <QBrush>
    #include <QStyle>
    #include <QPen>
    #include <QColor>

    class grafica_ProgressBar : public QProgressBar
    {
        Q_OBJECT
    public:
        grafica_ProgressBar();

    protected:
        void paintEvent(QPaintEvent*) Q_DECL_OVERRIDE;
    };

    #endif // GRAFICA_PROGRESSBAR_H

а это cpp grafica_progressbar.cpp

#include "grafica_progressbar.h"

grafica_ProgressBar::grafica_ProgressBar()
{

}

void grafica_ProgressBar::paintEvent(QPaintEvent *)
{
    int tmpValue = value();
    int TopPos = QStyle::sliderPositionFromValue(minimum(), maximum(), tmpValue, width());

    QPainter p(this);

    if (tmpValue<maximum()*0.85)
    {
        p.setPen(Qt::green);
        p.setBrush(QBrush(Qt::green));
    }
    else
    {
        p.setPen(QColor(255,51,51));
        p.setBrush(QColor(255,51,51));
    }

     p.drawRect(0,0,TopPos,height());


    p.setPen(Qt::gray);
    p.setBrush(QBrush(Qt::lightGray));
    p.drawRect(TopPos, 0, width(), height()); //riempio tutto il resto di grigio


    p.setPen(Qt::black);
    p.setBrush(QBrush(Qt::black));
    p.drawText(0,0, width(), height(), Qt::AlignCenter, QString::number(tmpValue ) + " bar");
}

и это первый вызов конструктора пользовательского интерфейса

TestProgres = new grafica_ProgressBar();

ui->gridLayout->addWidget(TestProgres);

TestProgres->setMaximum(400);
TestProgres->setValue(300);

если я попытаюсь вызвать TestProgres->setValue(200) внутри кнопки, я не увижу никакого обновления.

Итак, в чем проблема?


person Pierluigi Rovere    schedule 24.01.2018    source источник
comment
Попробуйте вызвать update после setValue.   -  person Dmitry Sazonov    schedule 24.01.2018
comment
Я только что протестировал его, и он работает без ручного обновления. Просто добавил действие к MainWindow, добавляя 10 к значению ProgressBar каждый раз. Покажите свой код, где вы вызываете setValue.   -  person Bearded Beaver    schedule 24.01.2018
comment
Вы уверены, что вызываете метод, связанный с кнопкой? Я также подтверждаю, что ваш код работает, поскольку setValue() QProgressBar вызывает update() внутри, поэтому нет необходимости вызывать update() return.   -  person eyllanesc    schedule 24.01.2018
comment
То же самое. Ваш код работает. Неудача где-то в другом месте.   -  person Xplatforms    schedule 24.01.2018
comment
Теперь это работает! Очистите проект, пересоберите (как последние 10 раз) и молитесь. :| Спасибо всем   -  person Pierluigi Rovere    schedule 24.01.2018
comment
Не меняйте название на [SOLVED] или подобное. Вместо этого ответьте на свой вопрос и предоставьте нам решение, а также отметьте его как принятое. Это поможет будущим читателям сайта.   -  person Goodbye StackExchange    schedule 24.01.2018


Ответы (1)


Код начинает работать после операции «очистить, перестроить и запустить».

Я отредактировал код только для отображения правильного значения.

Спасибо всем!

person Pierluigi Rovere    schedule 24.01.2018