[Qt] Custom-Drawing hängt immer einen Schritt zurück
-
Ich arbeite zurzeit an einer Qt-Gui für ein rundenbasiertes Spiel an dem ich schon länger arbeite.
Bisher habe ich einfach die gesamte Szene Auf ein Custom-Widget gezeichnet. Schon da hat sich das Problem gestellt, dass ich auch hier zweimal die update()-Methode aufrufen musste. Ansonsten habe ich immer Die Szene vom letzten Zeichendurchgang gesehen.
Das lies sich aber recht leicht (Wenn auch unschön) durch zweimaliges aufrufen der genannten Methode lösen.Nun möchte ich das ganze auf QGraphicsWidget umstellen. (Unter anderem Wegen der Möglichkeit zur Animation)
Dabei hat sich jetzt wieder exakt das selbe Problem gezeigt. Allerdings lässt es sich partout nicht durch den gleichen Hack lösen.
Ich bastel da jetzt gut seit ein paar Stunden rum und es wäre echt sehr toll, wenn mir jemand sagen könnte worauf ich achten muss. Ich muss irgendwas ziemlich falsch machen...
-
Mach mal ein kleines Beispiel, an dem man das sehen kann. Alles andere hat keinen Sinn.
-
The-Kenny schrieb:
Bisher habe ich einfach die gesamte Szene Auf ein Custom-Widget gezeichnet. Schon da hat sich das Problem gestellt, dass ich auch hier zweimal die update()-Methode aufrufen musste. Ansonsten habe ich immer Die Szene vom letzten Zeichendurchgang gesehen.
Das hört sich sehr seltsam an, da das eigentlich keinen Unterschied machen sollte ob du update() ein, zwei, oder dreimal hintereinander aufrufst.
http://doc.trolltech.com/4.5/qwidget.html#update
Calling update() several times normally results in just one paintEvent() call.
-
Ein minimales Beispiel kann ich leider nicht geben...
Es ist so:
Ich habe eine von QGraphicsScene abgeleitete Klasse. Diese besitzt eine Methode setScene(scene). In dieser Methode wird eine Membervariable zugewiesen und update() aufgerufen.
Vom Inhalt dieser Membervariable hängt das gezeichnete ab. (Die Zuweisung etc. klappt, mit Sicherheit!)Die setScene-Methode wird von einem boost::signal irgendwo aus dem tiefen der Spielengine aufgerufen.
Wenn nun diese Methode aufgerufen wird, sehe ich die Szene des letzten Aufrufs. Wenn ich dann das Fenster vergrößere etc. (Also ein paintEvent o.ä. auslöse) Sehe ich die aktuelle Szene. Dann stimmt alles.
Ich habe auch schon mit Caching und DrawOptimizing oder wie das heißt im QtDesigner rumgespielt. Hat aber nichts gebracht.
Es scheint so, als würde ich irgendwas vergessen.
-
Naja, wie bereits gesagt steht update() ja nicht in direkter Verbindung mit der paintEvent().
Es wird immer erst dann wirklich gezeichnet, wenn wieder in die main event loop zurückgesprungen wurde.
Wenn du wirklich sofort zeichnen willst, müsstest du dazu direkt repaint() aufrufen.
-
Okay, es kann sein dass ich das vorher gemacht habe... aber ich setze ja nun auf QGraphicsScene bzw. View. Da gibt es keine redraw()-Methode.
Gibt es eine Möglichkeit das auch so zu bewerkstelligen? (Am liebsten aus der Scene heraus)
Edit:
Hier der Codeausschnitt mit dem es läuft (Als QWidget):void setScene(aw::scene::ptr scene) { currentScene = scene; this->repaint(); this->repaint(); }
-
Okay... ich hab nochmal rumprobiert:
Wenn ich repaint() von der angehangenen QGraphicsView aufrufe, funktioniert es genau wie es soll.
Das musste ich jetzt durch ein zweites Signal einhängen, aber nagut. Ist halt nicht so gaaanz perfekt. Aber ich lass es einfach so.