Ermitteln Sie die Bildschirmposition eines QGraphicsItem

8

Anwendungsfall: Dies sollte ein ziemlich häufiges Problem sein. In einem normalen QMainWindow mit QMdiArea lebt ein mdiChild mit einer QGraphicsView. Diese Ansicht zeigt eine QGraphicsScene mit QGraphicsItems an. Ein Rechtsklick auf eines dieser Objekte selektiert (fokussiert) das Objekt und öffnet ein Kontextmenü, welches bequem an den Bildschirmkoordinaten QGraphicsSceneMouseEvent::screenPos() platziert wird. Dies funktioniert wie erwartet.

Jetzt möchte ich das gleiche Kontextmenü anzeigen, wenn der Benutzer eine Taste drückt (z. B. Qt :: Key_Menu). Ich kenne das ausgewählte (fokussierte) Element, ich kenne die Ansicht, die die Szene anzeigt.

Meine Frage ist also:
Was ist der richtige Weg, um die Position (in globalen Bildschirmkoordinaten) der sichtbaren Darstellung eines QGraphicsItem innerhalb einer Szene zu erhalten?

Hier funktioniert was nicht:

%Vor%

Das Dokument sagt: Wenn Sie wissen möchten, wo sich im Viewport ein Element befindet, können Sie QGraphicsItem :: mapToScene () für das Element und dann QGraphicsView :: mapFromScene () für die Ansicht aufrufen.
Was ich genau mache, richtig?

Ich bin gerade auf einen Thread in einem deutschen Forum gestoßen, der auf Folgendes hinweist:

%Vor%

oder noch schöner:

%Vor%

Dies könnte eine allgemeinere Antwort auf meine Frage geben ...

    
Martin Hennings 26.03.2012, 12:04
quelle

3 Antworten

6

Ich habe eine funktionierende Lösung gefunden.
Das QGraphicsItem muss auf dem Bildschirm sichtbar sein. (Wahrscheinlich, wenn es nicht sichtbar ist, weil die Ansicht einen anderen Punkt der Szene zeigt, könnte man den Punkt auf das Rect des Ansichtsfensters beschränken.)

%Vor%

Es ist wichtig, das Ansichtsfenster der Ansicht zu verwenden, um die Ansichtskoordinaten den globalen Koordinaten zuzuordnen.

Die Erkennung des Kontextmenüs (Qt :: Key_Menu) geschieht in keyPressEvent() des "Haupt" QGraphicsItem (aufgrund der Struktur meines Programms).

    
Martin Hennings 04.04.2013, 10:45
quelle
1

Der Code scheint korrekt zu sein. Aber es könnte ein Problem mit der Erstellung des Kontextmenüs geben.

Haben Sie das übergeordnete Element von QContextMenu auf MainWindow festgelegt (oder etwas in Ihrer Anwendung?)?

Ich denke, das könnte in Ihrem Fall das Problem sein.

Viel Glück !!

    
EngineeredBrain 26.03.2012 18:17
quelle
1

Nur ein Stich in die Dunkelheit, aber werfen Sie einen Blick auf diese Ссылка .

Beim Durchsehen der Qt-Dokumentation scheint die Verwendung von QGraphicsView ein außergewöhnliches Verhalten in Bezug auf Verknüpfungen zu verursachen.

Es sieht so aus, als könnte es einen normativen Weg geben, um das gewünschte Ergebnis zu erreichen.

Je nachdem, wie Sie Ihr Kontextmenü, Verknüpfungen und QGraphicsView implementieren, müssen Sie möglicherweise die Qt :: ContextMenuPolicy für QGraphicsView entsprechend einstellen und das Menü anders aufbauen und aufrufen.

Ich bin sehr interessiert an dieser Frage, da ich in Kürze etwas ganz ähnliches machen muss!

    
Mike G 27.03.2012 10:40
quelle