2017-03-01 2 views
0

Ich habe Projekt die innere Struktur von ELF Binärdateien anzuzeigen. Ich benutze QGraphicsView und QGraphicsScene. So kann ich Blöcke in der Grafikszene anzeigen, aber ich benötige nach dem Mausklick auf Einzelblock den Inhalt dieses Blockes anzeigen. Ich versuche, Funktion zu verwenden:Qt QGraphicView und QGraphicScene Mausposition

void MainWindow::mousePressEvent(QMouseEvent* event) 
{ 
    ui->textEdit->append(QString("x = %1, y = %2").arg(event->Pos().x()).arg(event->Pos().y())); 
} 

Aber Position verfolgt im ganzen Fenster. Das Problem ist, dass Breite und Höhe des Fensters dynamisch sind und die Höhe von QGraphicsScene größer sein kann als die des Fensters. Ich kann also keinen einzelnen Block verfolgen.

Ich versuchte eine Funktion wie: mapFromScene, mapToScene, mapFromGlobal, ... aber ich weiß nicht, wie diese Funktionen funktioniert, aber Position, was ich bekomme, war nicht richtig.

Es kam mir in den Sinn, dass Position durch Scrollbar von QGraphicalView und Größe des Fensters berechnet werden sollte, aber es ist schwer genau zu berechnen und es ist nicht die richtige Lösung.

Eine Vorstellung, erhalten wie wahre Position auf Grafik-Szene? Danke für jede Hilfe.

+0

Es ist nicht ganz klar, was Sie wollen.Alle diese Koordinatensysteme sind relativ zueinander und für jede gegebene Implementierung von mousePressEvent, entweder für Widgets oder für Szenenelemente, arbeiten Sie im Koordinatensystem dieses Objekts. Wenn Sie das Mausereignis in Szenenkoordinaten einfügen möchten, führen Sie QGraphicsScene :: mousePressEvent erneut aus. Wenn Sie sie in Ansichtskoordinaten haben möchten, führen sie QGraphicsView :: mousePressEvent usw. neu aus. Ich würde lesen "wahre Position in der Grafik-Szene" als impliziert, dass QGraphicsScene :: mousePressEvent der richtige Ort ist, aber es ist nicht klar. – goug

+0

danke, ich werde es versuchen. – cherioss

+0

Warum behandeln Ereignisse im obersten Fenster? Der Zweck des Grafikszenen-Systems besteht darin, Elemente bereitzustellen, mit denen Sie interagieren können. Sie können alle Arten von Interaktion mit den Elementen selbst haben - sie wurden entworfen, um das einfach zu machen. –

Antwort

-1

Ich löste dieses Problem mit make mein Objekt, die QGraphicView erben (MyQGraphicView) und dann habe ich Funktion mousePressedEvent für dieses Objekt deklariert. Das hilft mir.

1

QGraphics verwendet, wie andere Grafikframeworks, mehrere Koordinatensysteme und Sie müssen überlegen, mit welchem ​​System Sie arbeiten, wenn Sie mit Koordinaten arbeiten.

Wir denken an eine QGraphicsScene als eine Welt, in denen es Objekte, die durch QGraphicsItem s vertreten sind (oder QGraphicsObject' s., Wenn Sie wollen, dass sie Signale und Slots verwenden).

Um einen Bereich der Welt zu sehen, verwenden wir einen oder mehrere QGraphicsView s.

Um zwischen den verschiedenen Koordinatensystemen abzubilden, stellt Qt die nützlichen Funktionen mapTo und mapFrom zur Verfügung.

Ausgehend von oben, mit einer QGraphicsView, können wir eine Koordinate konvertieren und QGraphicsView::mapToScene verwenden, um die Koordinate im Koordinatensystem der Szene zu erhalten. Daraus wenn ein Element an, dass wohnt koordinieren, können wir erhalten die auf das Element relative Koordinate, QGraphicsItem::mapFromScene verwenden.

Also, mit den drei Ebenen (Ansicht, Szene und Element) überlegen Sie, in welchem ​​System die Koordinate ist und wo Sie damit arbeiten wollen.

wie bekommt man wahre position in der graphischen szene?

Hoffentlich sollten Sie nun, dass die Sie im Hauptfenster zur Verfügung gestellt wurden Koordinatensystem der in der Ansicht koordinieren denken und Sie können das Szene Koordinatensystem Karte.

QPointF scenePoint = mapToScene(event->Pos()); 

Dies ist jedoch Dinge overcomplicating und Sie finden es einfacher, mit der Szene direkt zu arbeiten und die darin enthaltenen Elemente, durch die eigene mouse/Presse/Veröffentlichung Ereignisse Stück Überlastung, die QGraphicsScene Koordinaten liefern.

+0

danke ein Wille ty es – cherioss