QGraphicsView - Verständnisproblem

Verschiedenes zu Qt
Antworten
sonynos
Beiträge: 6
Registriert: 6. März 2009 10:32

QGraphicsView - Verständnisproblem

Beitrag 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?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

QGraphicsView::mapToScene() ?
sonynos
Beiträge: 6
Registriert: 6. März 2009 10:32

Beitrag 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.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
neuschi
Beiträge: 78
Registriert: 23. Mai 2007 10:59

Beitrag 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
sonynos
Beiträge: 6
Registriert: 6. März 2009 10:32

Beitrag 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.
Antworten