0

私の大学では、Eclipse統合でQT Jambi(Java)を使用して、インターフェースを使用しています。エレベーターインターフェースのデザインを改善したいと思います。

主な問題は、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ウィジェットの名前であることに注意してください

4

1 に答える 1

3

2つの問題があるようです。

  1. (私は推測します)あなたはThread.sleep()GUIスレッドで呼び出しています。つまり、simulateを呼び出すときは、残りのGUI操作と同じスレッドで呼び出します。これにより、GUI全体が一時停止します。

  2. Qtに実際にUIを更新する機会を与えたことはありません。を呼び出すとui.LCDfloor.display(actualFloor)、UIを更新できるようにpaintイベントがキューに入れられますが、UIに実際にpaintイベントを実行する機会を与えるのではなく、ループを続行して、シミュレーションが終了するまでUIが更新されないようにします。終了しました。

2つの基本的な修正があります。

  1. 眠らないでください、それは貧弱なデザインです。代わりに、タイマーと信号を使用して変更をシミュレートします。
  2. processEventsを使用してイベントを強制的に処理します。

また、GUI以外のスレッドからGUI要素を更新することはできないことに注意してください。そして、これは宿題なので、残りはあなたに任せます:)。

于 2012-04-13T00:08:10.583 に答える