2012-04-12 5 views
0

In meiner Universität arbeiten wir mit Schnittstellen, mit QT Jambi (Java) mit der Eclipse-Integration. Ich möchte mein Design meiner Aufzugschnittstelle verbessern.QT Jambi - QLCDNumber in Echtzeit aktualisiert

Das Hauptproblem ist, dass ich die QLCDNumber mit dem Boden in Echtzeit aktualisieren möchte. Was ich tue, um den Aufzug zu simulieren, ist ein Thread.sleep (1000) zwischen zwei Stockwerken zu machen, so dass meine QLCDNumber "eine Animation" mit der Aufschrift "1 ... 2 ... 3 ..." anzeigt. 4 ". Das Problem ist, dass die QLCDNumber nur 1 und 4, keine Animation anzeigt.

So zum Beispiel (wieder), der Code, den ich gemacht ist diese:

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

Warum nur dieser Code zeigt die 1. Etage und die letzte? Sorry, wenn Sie nicht verstanden haben, was ich wollte, verbessert sich mein Englisch jeden Tag :)

Vielen Dank im Voraus.

* Bitte beachten Sie, dass LCDFloor ist der Name des QLCDNumber Widget

+1

Wenn Sie Qt> = 4.6 verwenden, können Sie den Aufzug fast nur mit einer 'QPropertyAnimation' auf der Werteigenschaft' QLCDNumber' simulieren. – alexisdm

Antwort

3

Es sieht aus wie Sie zwei Probleme:

  1. (Ich gehe davon aus) Du nennst Thread.sleep() auf dem GUI-Thread. Mit anderen Worten, wenn Sie simulate aufrufen, tun Sie dies im selben Thread wie die anderen GUI-Operationen. Dadurch wird die gesamte GUI angehalten.

  2. Sie haben Qt nie die Möglichkeit gegeben, die Benutzeroberfläche zu aktualisieren. Wenn Sie ui.LCDfloor.display(actualFloor) aufrufen, wird das Ereignis a paint in die Warteschlange gestellt, damit die Benutzeroberfläche aktualisiert werden kann. Anstatt der Benutzeroberfläche jedoch die Möglichkeit zu geben, das Paint-Ereignis tatsächlich auszuführen, fahren Sie mit der Schleife fort, wodurch die Benutzeroberfläche erst nach der Aktualisierung aktualisiert wird Die Simulation ist beendet.

Sie haben zwei grundlegende Korrekturen:

  1. Sie nicht schlafen, es ist schlechtes Design. Verwenden Sie stattdessen Timer und Signale, um die Änderungen zu simulieren.
  2. Erzwinge Ereignisse, die mit processEvents verarbeitet werden.

Denken Sie auch daran, dass Sie ein GUI-Element nicht von einem Nicht-GUI-Thread aktualisieren können. Und da dies Hausaufgaben sind, überlasse ich dir den Rest :).

+0

Vielen Dank für die Antwort. Ich werde daran arbeiten. Ich werde über Signale und Timer lernen. Ich habe genau verstanden, was in meinem Programm passiert. Und ja, das ist auf dem GUI-Thread: P – Thorba