2016-08-26 2 views
0

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

Вот мой код:

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 (* изображение, 50);

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

+0

Вам не нужно создавать 'QImage' и' QPixmap' с новым оператором. Вы можете создавать экземпляры в стеке. Оба поддерживают COW. –

+0

Я изменю это, thx! – WJuz

ответ

1

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

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

+0

Прохладный, еще раз спасибо :) Музыкальный плеер по-прежнему «растет»;) – WJuz

+0

@WJuz Важным уроком здесь является Qt GUI - * однопоточный *. Это означает, что когда этот единственный поток GUI выполняет ваш метод обработки слотов или событий, он не будет делать ничего другого (например, реагировать на пользователя, обновлять экран, делать сетевые материалы). Это означает, что вы никогда не должны блокировать цикл событий, ожидая/спящий/выполняющий длительный расчет (<16 мс для интерактивного приложения реального времени, такого как игра, что-то вроде нескольких сотен мс для обычного рабочего стола). Используйте другие механизмы, такие как 'QTimer', предлагаемые здесь, если вам нужно подождать минутку. – hyde

+0

Благодарим всех вас, efect довольно приятно ... только что я хотел http://www.mediafire.com/download/992zmc582ppc8t9/Nagywanie_2016_08_26_17_25_12_437.mp4: D – WJuz

Смежные вопросы