Seite 1 von 1

QGraphicsView - Verständnisproblem

Verfasst: 30. März 2009 12:36
von sonynos
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?

Verfasst: 30. März 2009 12:41
von franzf
QGraphicsView::mapToScene() ?

Verfasst: 30. März 2009 12:58
von sonynos
leider nein :(

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()));
}
edit1: und komme zu keinem vernünftigen Ergebnis.

Verfasst: 30. März 2009 13:03
von franzf
Vielleicht deshalb?
Returns the viewport coordinate point mapped to scene coordinates.
Du implementierst das mousePressEvent und bekommst die Koordinaten des clicks in deinem QGraphicsView. Der viewport ist aber NICHT dein GraphicsView, sondern das Widget, welches die Scene zeichnet.

Verfasst: 30. März 2009 13:07
von neuschi
Der beste weg ist wohl, das Handling in

Code: Alles auswählen

QGraphicsScene::mousePressEvent ( QGraphicsSceneMouseEvent * mouseEvent ) 
zu machen.

Hier hast du dann ohne weiteres Rumrechnen

Code: Alles auswählen

QPointF QGraphicsSceneMouseEvent::scenePos () const
zur Verfügung.

\Ralf

Verfasst: 30. März 2009 14:06
von sonynos
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):

Code: Alles auswählen

QPointF tScenePos = mapToScene(pEvent->pos());
Der nächste Schritt ist dann zusätzlich die Transformation in map-Koordinaten:

Code: Alles auswählen

QTransform tTransform(mMatrix.inverted());
mLastMouseClick = tTransform.map(tScenePos);
.

Prima, ich bin einen Schritt weiter.