Seite 1 von 1
[gelöst] QGraphicsScene sofortiges update
Verfasst: 21. August 2009 17:32
von linuQs
Hallo, wie der Titel schon sagt, habe ich ein Problem mit QGraphicsScene. Für mein Programm muss update() sofort alles neumalen, damit folgendes Funktioniert:
Leider wird immer erst gewartet und dann erscheint erst das neue Bild. Gibt es eine Möglichkeit, das zu verhindern? Oder kann man irgendwie solange warten, bis update fertig ist?
Danke im Vorraus
Verfasst: 21. August 2009 17:35
von upsala
Du hast ein sleep() drinnen und wunderst dich, daß die Anwendung wartet. Wir wäre es wenn du die Event-Loop zum Zuge kommen lassen würdest?
Verfasst: 21. August 2009 17:40
von linuQs
Ich muss in dem Programm aber eine gewisse Zeit warten und habe da bisher nichs anderes als sleep() gefunden. Gibt es da Alternativen?
Verfasst: 21. August 2009 18:01
von upsala
Auch zu Qt3 gab es schon das timerEvent und den QTimer...
Verfasst: 21. August 2009 19:12
von linuQs
das weiß ich auch, aber sleep wird innerhalb einer Schleife aufgerufen und ich weiß nicht, wie du mit einem QTimer die Schleife anhalten und nach einer bestimmten Zeit weiterlaufen lassen willst.
Das mit dem Timer geht ohne Schleife natürlich, aber dann müsste ich große Teile des Projekts neuschreiben oder zumindest stark verändern, was ich jetzt wohl machen werde.
Verfasst: 21. August 2009 20:12
von franzf
Es ist eh fragwürdig, wenn du nach dem update() erstmal ne Pause machen MUSST. Da stimmt was nicht
Dein Problem ist einfach, dass nach dem update() erstmal nix passiert, außer dass ein event getriggert wird. Wenn Qt wieder in die EVentLoop darf, werden auch brav alle Events abgearbeitet. Und genau das passiert noch nicht, wenn die Funktion noch nicht durch ist. Da hilft kein Sleep. Da hilft nur ein
QCoreApplication::processEvents(), von dem ich kein allzugroßer Freund bin

Vor allem wenn du in ner Schleife sitzt und in jedem Schleifendurchgang alle Events abarbeiten willst...
Verfasst: 21. August 2009 20:25
von linuQs
Na ja, ich will halt ein Spiel programmieren wo ein Skript ausgeführt wird und da gibt es eben auch Wartezeiten, die auch an der richtigen Stelle auftreten sollen
Ich denke, ich werde den Code so umschreiben, dass ich es doch mit Timern machen kann. Bei Widgets gibt es ja repaint, das macht doch eigentlich ein sofortiges neumalen, oder? Hab eben gedacht, dass es sowas auch bei QGraphicsScene geben könnte.
Danke auf jeden Fall für den Hinweis mit processEvents()
Verfasst: 21. August 2009 20:37
von franzf
QGraphicsScene ist halt kein Widget mit nem paintEvent.
Wenn repaint dann auf dem QGraphicsView, denn das ist ein QWidget.
Du hast dir auch in der Doku das repaint angehscut? So von wg. Optimierungen und Flickern?
Verfasst: 21. August 2009 20:57
von linuQs
Ja, ich hab mir die doku zu repaint angeschaut, ich dachte eben eher an ein Äquivalent als an QWidget::repaint. In Zukunft sollte ich wahrscheinlich direkt timer benutzen...
Da die timer vermutlich die endgültige Lösung darstellen und ich noch nicht viel erfahrung mit dem Forum habe: wie kann ich das Thema denn als gelöst kennzeichnen?
Verfasst: 22. August 2009 07:38
von franzf
linuQs hat geschrieben:wie kann ich das Thema denn als gelöst kennzeichnen?
Ist in jedem Forum das selbe

Auf deinen allerersten Post gehen und den editieren (kannst du, denn du bist der Thread-starter). Dort den Title nach deinem Gusto anpassen (z.B. an den Anfang ein "[gelöst]" setzen.
Ciao