2016-08-26 23 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

new 연산자로'QImage'와'QPixmap'을 생성 할 필요가 없습니다. 스택에 인스턴스를 만들 수 있습니다. 둘 다 COW를 지원합니다. –

+0

내가 바꿀거야, 너! – WJuz

답변

1

루프에서 멈추었 기 때문에 버튼의 이미지를 업데이트 한 후에도 언제든지 위젯을 다시 그릴 필요가 없습니다. 이미지 업데이트를 마친 후에 만 ​​Qt가 위젯을 다시 그릴 수 있기 때문에 최종 결과 만 표시됩니다.

QTimer을 살펴보십시오. QTimer :: setInterval을 통해 타임 아웃을 50 밀리 초로 설정할 수 있습니다. 그런 다음 버튼 이미지의 색상을 QTimer :: timeout으로 변경하는 슬롯을 연결하십시오. 이 슬롯은 코드와 비슷하지만 루프가 없습니다. 예 : 슬롯의 각 호출은 루프의 단일 반복입니다. 마지막으로 애니메이션을 시작하거나 중지하려면 QTimer :: start 또는 QTimer :: stop을 호출합니다.

+0

쿨, 고마워요 :) 뮤직 플레이어는 여전히 "성장하고 있습니다";) – WJuz

+0

@WJuz 여기서 중요한 교훈은 Qt GUI가 * 싱글 스레드 *입니다. 즉,이 단일 GUI 스레드가 슬롯 또는 이벤트 핸들러 메소드를 실행할 때 다른 작업 (예 : 사용자 반응, 화면 업데이트, 네트워크 작업)을 수행하지 않습니다. 즉, 대기/수면/긴 계산 (게임과 같은 "실시간"대화 형 앱의 경우 16 밀리 초 미만, 일반 데스크톱 앱의 경우 수백 밀리 초)과 같은 이벤트 루프를 차단해서는 안됩니다. 잠시 동안 기다릴 필요가 있다면'QTimer'와 같은 다른 메커니즘을 사용하십시오. – hyde

+0

고맙습니다. 완벽합니다. ... 바로 제가 원했던 것입니다. http://www.mediafire.com/download/992zmc582ppc8t9/Nagywanie_2016_08_26_17_25_12_437.mp4 : D – WJuz