Ich habe ein Verständnisproblem mit QGraphicsView (view):
Ich habe der scene des views eine Karte in Form einer QPixmap (map) als Hintergrund zugewiesen. Über eine QMatrix (matrix) rechne ich die map-Koordinaten in view-Koordinaten um.
D.h., daß ich jedem QGraphicsItem (item), das ich der scene hinzufüge, diese matrix mitgebe. Aktualisiere ich die items mittels map-Daten, so werden diese dann an den erwarteten view-Positionen gezeichnet.
Aber: was muss ich tun, um jetzt die Position eines Mausklicks in den view in map-Koordinaten umzurechnen?
Kurzfassung:
---------------
- view besitzt eine QGraphicsScene (scene)
- scene hat eine Karte (map) als 'background'
- über QMatrix wird Skalierung und Translation map - view vollzogen
- wie rechne ich die Position eines Mausklicks in map-Koord um?
QGraphicsView - Verständnisproblem
leider nein 
Ich habe mir mal - einfach weil ich recht verzweifelt bin - alle möglichen Transformationen ausgeben lassen:
edit1: und komme zu keinem vernünftigen Ergebnis.
Ich habe mir mal - einfach weil ich recht verzweifelt bin - alle möglichen Transformationen ausgeben lassen:
Code: Alles auswählen
void MapView::mousePressEvent(QMouseEvent *pEvent)
{
// mLastMouseClick ist vom Typ QPointF
QTransform tTransform(mMatrix.inverted());
mLastMouseClick = mapFromScene(pEvent->pos());
mLastMouseClick = mapToScene(pEvent->pos());
mLastMouseClick = mapToScene(tTransform.map(pEvent->pos()));
mLastMouseClick = mapFromScene(tTransform.map(pEvent->pos()));
mLastMouseClick = tTransform.map(mapFromScene(pEvent->pos()));
mLastMouseClick = tTransform.map(mapToScene(pEvent->pos()));
}
Der beste weg ist wohl, das Handling in
zu machen.
Hier hast du dann ohne weiteres Rumrechnen
zur Verfügung.
\Ralf
Code: Alles auswählen
QGraphicsScene::mousePressEvent ( QGraphicsSceneMouseEvent * mouseEvent )
Hier hast du dann ohne weiteres Rumrechnen
Code: Alles auswählen
QPointF QGraphicsSceneMouseEvent::scenePos () const\Ralf
ich hab den Wald vor lauter Bäumen nicht gesehen...
Zuerst mal: ich habe meine matrix falsch verstanden. Zwar verstand ich, daß sie skaliert und translatiert, aber nicht, daß sie auch rotiert.
Deswegen sah ich das erste Posting von franzf (mapToScene) als falsch an. Das war aber (zumindest teilweise) richtig, ebenso wie der Hinweis von neuschi. Danke nochmal!
Der erste Schritt zur erfolgreichen Umrechnung der Koordinaten wäre also die Transformation von view-Koordinanten in scene-Koordinaten (in der Implementierung des views):
Der nächste Schritt ist dann zusätzlich die Transformation in map-Koordinaten:
.
Prima, ich bin einen Schritt weiter.
Zuerst mal: ich habe meine matrix falsch verstanden. Zwar verstand ich, daß sie skaliert und translatiert, aber nicht, daß sie auch rotiert.
Deswegen sah ich das erste Posting von franzf (mapToScene) als falsch an. Das war aber (zumindest teilweise) richtig, ebenso wie der Hinweis von neuschi. Danke nochmal!
Der erste Schritt zur erfolgreichen Umrechnung der Koordinaten wäre also die Transformation von view-Koordinanten in scene-Koordinaten (in der Implementierung des views):
Code: Alles auswählen
QPointF tScenePos = mapToScene(pEvent->pos());
Code: Alles auswählen
QTransform tTransform(mMatrix.inverted());
mLastMouseClick = tTransform.map(tScenePos);
Prima, ich bin einen Schritt weiter.