Koordinatentransformation QGraphicsScene vs QGraphicsView

Alles rund um die Programmierung mit Qt
Antworten
filip
Beiträge: 5
Registriert: 31. August 2011 19:17

Koordinatentransformation QGraphicsScene vs QGraphicsView

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

Re: Koordinatentransformation QGraphicsScene vs QGraphicsVie

Beitrag 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?
filip
Beiträge: 5
Registriert: 31. August 2011 19:17

Re: Koordinatentransformation QGraphicsScene vs QGraphicsVie

Beitrag 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()?
filip
Beiträge: 5
Registriert: 31. August 2011 19:17

Re: Koordinatentransformation QGraphicsScene vs QGraphicsVie

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