Быстрое изменение яркости значка QPushButton

Я нашел функцию, делающую QImage ярче, и использовал ее в своем приложении Qt. Я хочу показать простую "анимацию", делающую кнопку шаг за шагом ярче, а затем снова шаг за шагом возвращаться в исходное состояние после того, как пользователь щелкнет по ней.

Вот мой код:

void Widget::on_stopButton_clicked(){

    player.stop();

    for(int i = 0; i <= 50; ++i){

        QImage* image = new QImage(":/Graphics/Graphics/StopButton.png");
        changeBrightness(*image, i);
        QPixmap* pixmap = new QPixmap(QPixmap::fromImage(*image));
        ui->stopButton->setIcon(QIcon(*pixmap));
        QThread::msleep(50);

    } 

}

Это не работает, как я ожидал... Я вижу только конечный эффект, поэтому последний вызов: changeBrightness(*image, 50);

Кажется, что пользователь может видеть изменения в форме только после завершения функции, правильно? Есть ли другой способ сделать такую ​​"анимацию"?

1 ответ

Решение

Вы не даете Qt время перерисовывать виджет после обновления изображения кнопки, потому что вы застряли в цикле. Только после того, как вы закончите обновление изображения, Qt сможет перерисовать ваш виджет, поэтому вы видите только конечный результат.

Посмотрите в QTimer. Вы можете установить его таймаут на 50 миллисекунд через QTimer::setInterval. Затем подключите слот, который меняет цвет изображения кнопки на QTimer:: timeout. Этот слот будет очень похож на ваш код, но без цикла. Например, каждый вызов слота - это отдельная итерация вашего цикла. Наконец, чтобы запустить или остановить анимацию, вы вызываете QTimer:: start или QTimer:: stop.

Другие вопросы по тегам