[gelöst] QGraphicsScene sofortiges update

Alles rund um die Programmierung mit Qt
Antworten
linuQs
Beiträge: 26
Registriert: 16. August 2009 11:28

[gelöst] QGraphicsScene sofortiges update

Beitrag 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:

Code: Alles auswählen

items.change();
scene.update();
sleep(5);
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
Zuletzt geändert von linuQs am 22. August 2009 10:36, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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?
linuQs
Beiträge: 26
Registriert: 16. August 2009 11:28

Beitrag 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?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Auch zu Qt3 gab es schon das timerEvent und den QTimer...
linuQs
Beiträge: 26
Registriert: 16. August 2009 11:28

Beitrag 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.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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...
linuQs
Beiträge: 26
Registriert: 16. August 2009 11:28

Beitrag 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 :wink:

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()
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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?
linuQs
Beiträge: 26
Registriert: 16. August 2009 11:28

Beitrag 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?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

linuQs hat geschrieben:wie kann ich das Thema denn als gelöst kennzeichnen?
Ist in jedem Forum das selbe :P
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
Antworten