2012-04-12 3 views
0

우리 대학교에서는 QT Jambi (Java)와 Eclipse Integration을 사용하여 인터페이스 작업을하고 있습니다. Elevator 인터페이스 디자인을 개선하고 싶습니다.QT Jambi - 실시간으로 업데이트되는 QLCDNumber

주요 문제는 QLCDNumber를 실시간으로 바닥으로 업데이트하고 싶습니다. 엘리베이터를 시뮬레이트하기 위해, 2 층 사이에서 Thread.sleep (1000)을 수행하는 것이므로, QLCDNumber는 "1 ... 2 ... 3 ..."이라는 애니메이션을 표시합니다. 4 ". 문제는 QLCDNumber가 1과 4 만 표시하고 애니메이션은 표시하지 않는다는 것입니다.

따라서, 예를 들어 (재개), 내가 만든 코드이 하나입니다

private void simulate(int floor){ 
    while(actualFloor < floor){ 
     try{ 
      Thread.sleep(1000); 
     }catch(InterruptedException e){}; 
    actualFloor++; 
    ui.LCDfloor.display(actualFloor); 
    } 
} 

왜이 코드는 1 층과 마지막을 나타낸다는? 죄송합니다. 원했던 것을 이해하지 못하면 매일 영어 실력이 향상됩니다.

감사합니다.

* 그 LCDFloor을 유의하시기 바랍니다 당신이 두 가지 문제를 가지고있는 것처럼 그것은 보이는 QLCDNumber 위젯

+1

Qt> = 4.6을 사용하는 경우 'QLCDNumber'값 속성에서 'QPropertyAnimation'만 사용하여 거의 전체적으로 엘리베이터를 시뮬레이트 할 수 있습니다. – alexisdm

답변

3

의 이름입니다

  1. (I 가정) 당신은 GUI 스레드에서 Thread.sleep()를 호출하고 있습니다. 즉, simulate를 호출하면 다른 GUI 작업과 동일한 스레드에서 작업을 수행하게됩니다. 이로 인해 전체 GUI가 일시 중지됩니다.

  2. Qt에 실제로 UI를 업데이트 할 기회가 주어지지 않았습니다. ui.LCDfloor.display(actualFloor)에 전화하면 UI가 업데이트 될 수 있도록 페인트 이벤트가 대기 상태가되지만 실제로 UI에 페인트 이벤트를 실행할 기회를 부여하는 대신 루프를 계속 수행하면 UI가 업데이트 될 때까지 계속 업데이트되지 않습니다. 시뮬레이션이 끝났습니다.

당신은 두 가지 기본 수정이 있습니다
  1. 잠을하지 마십시오을, 그것은 가난한 디자인입니다. 대신 타이머 및 신호를 사용하여 변경 사항을 시뮬레이션하십시오.
  2. processEvents을 사용하여 처리 할 이벤트를 강제 실행하십시오.

GUI가 아닌 스레드에서 GUI 요소를 업데이트 할 수 없습니다. 그리고 이것이 숙제이기 때문에 나는 나머지를 너에게 남겨 둘 것이다. :).

+0

해답을 가져 주셔서 감사합니다. 나는 그것에 대해 연구 할 것이다. 나는 신호와 타이머에 대해 배울 것이다. 나는 내 프로그램에서 어떤 일이 일어나고 있는지 완벽하게 이해했다. 그리고 예, 그것은 GUI 스레드에 있습니다 : P – Thorba