QGraphicsScene: Spielfeld zoombar, Steuerungsfenster fest

Alles rund um die Programmierung mit Qt
Antworten
RISC
Beiträge: 2
Registriert: 13. Mai 2009 12:13

QGraphicsScene: Spielfeld zoombar, Steuerungsfenster fest

Beitrag von RISC »

Hallo erstmal!
Ich bin gerade dabei, mit Qt eine grafische Oberfläche für ein Spiel zu programmieren und komme nun an einer Stelle nicht mehr weiter.

Es geht um das Spielfeld einer Wirtschaftssimulation, welches in einer QGraphicsScene angezeigt wird.

Mein Ziel ist es, in dieser Spielszene sowohl das Spielfeld (zoombar, scrollbar) anzuzeigen, als auch ein Widget (oder mehrere) zum Steuern der Spielfunktionen und Anzeigen von Werten. Dieses Widget soll demnach weder gezoomt, noch bewegt werden. Außerdem soll es nicht im Betriebssystem-Stil, sondern mit einem eigenen QStyle angezeigt werden (Also kein MDI-Fenster!)

Wenn ich dieses Widget über QGraphicsProxyWidget mit eigenem Style der Szene hinzufüge und anzeigen lasse, habe ich schon mal ein schönes Fenster in der Szene. Mit setFlags( QGraphicsPixmapItem::ItemIgnoresTransformations ) kann ich es auch dazu bringen, nicht gezoomt zu werden.
Allerdings verändert sich beim Zoomen und Scrollen des Views zwangsweise die Position des Anzeigewidgets, da es ja am Ursprung der Szene verankert ist.

Gibt es eine Möglichkeit, dieses Anzeigewidget fest am Viewport-Koordinaten-Ursprung zu verankern?
Ist es ein besserer Weg, das Widget aus der Szene heraus zu nehmen? Ich habe mich bisher entschieden, es in die Szene einzubinden, weil es ja nur in dieser einen Szene angezeigt werden soll (es wird mehrere andere Szenen geben, zwischen denen oft gesprungen werden muss).
Bisher muss ich auch immer beim Szenenwechsel einen view->resetMatrix() machen, damit die anderen Szenen nicht gezoomt erscheinen. Eine andere Idee wäre also, verschiedene Views zu benutzen. Ich habe es nur beim besten Willen nicht hingekriegt, zwei Views (das Vordere transparent) übereinander anzuzeigen, was wahrscheinlich auch gar nicht so gedacht ist (Nebeneinander kein Problem, aber ich will es nun mal übereinander).

Ich hoffe, ihr habt verstanden was ich meine und könnt euch irgendwie in das Problem hineinversetzen. Alle, die schon mal Transport Tycoon o.ä. gespielt haben, werden verstehen, was ich meine. Ich suche eine Art Layer vor dem Spielfeld, in dem nur ungezoomte Steuerungs-Elemente und Fenster angezeigt werden, das Ganze möglicht Style-bar und mit der Szene verknüpft (Thema Szenenwechsel).

Hat jemand noch eine andere Idee dazu, oder weiß, wie man es realisieren könnte?
Ich bin gespannt auf eure Antworten. Danke schonmal!
RISC
Beiträge: 2
Registriert: 13. Mai 2009 12:13

Beitrag von RISC »

Da mir keiner eine Antwort geben konnte, habe ich slbst zu einer Lösung gefunden. Für alle die es interessiert:

Ich habe ein GraphicsView für das Spielfenster, in dem sich auch die Szene mit den Steuerelementen über QGraphicsProxyWidget eingebunden) befindet.
Diese Szene enthält wiederum ein QGraphicsView, auch als QGraphicsProxyWidget eingebunden. In diesem zweiten View befindet sich nun die eigentliche Spielfeld-Szene. Das zweite View wird über die wheelEvents der ersten Szene gezoomt. Das Zoomen und Handeln von events (Mausklick, Mausposition, etc) klappt in dieser verschachtelten Anordnung bisher auch prima!

Eine Einschränkung: Man sollte in die so eingebundene Spielfeldszene keine Widgets als proxies mehr einbinden, dies führt zu Fehlern. Aber da die gesamten Steuerelemente ja sowieso nicht mit dem Spielfeld gezoomt werden sollen, sondern in der Szene darüber dargestellt werden, stellt das denke ich kein Problem dar.

Die Anordnung kann ich also bisher nur empfehlen. Wahrscheinlich ist sie nur nicht sehr performant, da alles so verschachtelt ist. Allerdings ist das bei meinem Vorhaben momentan nicht ganz so wichtig. Funktioniert jetzt auch prima im Fullscreen modus, also ideal für Spiele!
Antworten