QGraphicsScene: Spielfeld zoombar, Steuerungsfenster fest
Verfasst: 13. Mai 2009 14:25
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!
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!