Seite 1 von 1

Koordinatentransformation QGraphicsScene vs QGraphicsView

Verfasst: 1. September 2011 11:07
von filip
Hallo zusammen,

ich baue für meine Diplomarbeit gerade eine Drag&Drop-GUI und nutze hierfür so etwas ähnliches wie das DiagramScene-Beispiel. Der Hauptunterschied ist wohl, dass ich anstatt der Scene die View reimplementiert habe und auch den Drop-event und die anderen Mouse-events in der View abfange.
Eigentlich läuft alles gut und rund, solange sich die View im linken oberen Bereich befindet. Sobald ich aber scrolle und dann Items droppe, werden sie an die Position gesetzt die sie ungescrollt bekommen würden.

1. Ist die Vermutung richtig, dass es am Droppen in die View statt in die Scene liegt?
2. Kann man die Umrechnung auf die korrekte Position in der Scene irgendwie erwirken?
3. oder sollte ich statt der View die Scene einfach reimplementieren?

Vielen Dank,
Filip

Re: Koordinatentransformation QGraphicsScene vs QGraphicsVie

Verfasst: 1. September 2011 12:01
von franzf
1) Ja
2) QGrapphicsScene::mapToScene()
3) View ist halt die Anzeigeklasse, Scene die "Datenklasse", sie hält die Items die dann in der View gezeichnet werden sollen. Eine scene kann in mehreren View angezeigt werden. Die hinter einer view liegende scene kann ausgetauscht werden. Wenn du also von QGraoihcsView ableitest, nötigst du alle Nutzer, deine View zum Anzeigen zu verwenden.
Ob du jetzt von der View oder von der Scene ableiten solltest, kommt auf deinen Fall an. Welche protected-Methoden von QGraphicsView verwendest verwendest du, welche reimplementierst du? Ginge das auch nur mit der Scene? Ginge es auch komplett OHNE Ableiten?

Re: Koordinatentransformation QGraphicsScene vs QGraphicsVie

Verfasst: 1. September 2011 12:35
von filip
Danke schon mal,
ich versuche gleich mal mapToScene() zu verstehen. Zuvor aber Antworten auf deine Fragen (bzw. neue Fragen):
franzf hat geschrieben:Wenn du also von QGraoihcsView ableitest, nötigst du alle Nutzer, deine View zum Anzeigen zu verwenden.
Ist das schlimm? es gibt ja eh nur eine View.
franzf hat geschrieben:Welche protected-Methoden von QGraphicsView verwendest verwendest du, welche reimplementierst du?
Protected habe ich folgende reimplementiert:
  • void drawBackground ( QPainter * painter, const QRectF & rect );
  • void dragEnterEvent(QDragEnterEvent *event);
  • void dragMoveEvent(QDragMoveEvent *event);
  • void dropEvent(QDropEvent *event);
  • void mousePressEvent(QMouseEvent *event);
  • void mouseMoveEvent(QMouseEvent *event);
  • void mouseReleaseEvent(QMouseEvent *event);
Teilweise wird dann auch die ursprüngliche QGraphicsView-Mausaktion im Anschluss an einige eigene Zeilen Code ausgeführt.
franzf hat geschrieben:Ginge das auch nur mit der Scene? Ginge es auch komplett OHNE Ableiten?
Komplett ohne geht es sicher nicht, denn es wird einiges darin gemacht. Ich bin mir ziemlich sicher, dass es auch mit der Scene ginge, allerdings habe ich in den Anfängen meiner Arbeit mich für die View entschieden, da a) die Folgen für mich noch nicht abzusehen waren und b) ich es mit der Scene nicht auf Anhieb so hinbekommen habe. Aber eigentlich sollte da kein großer Unterschied bestehen, wenn ich mir das so angucke. Das umzubauen wäre nur relativ aufwändig und wenn QGrapphicsScene::mapToScene() eine Alternative ist würde ich das versuchen. Btw.: meinst du dann nicht QGraphicsView::mapToScene()?

Re: Koordinatentransformation QGraphicsScene vs QGraphicsVie

Verfasst: 1. September 2011 13:38
von filip
Hat bestens geklappt, einfach
mapToScene(event->pos()) für das QDropEvent *event (bzw. auch bei anderen Events)
statt nur event->pos() und schon ist alles wie es sein soll :D

Vielen Dank,
Filip