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
Koordinatentransformation QGraphicsScene vs QGraphicsView
Re: Koordinatentransformation QGraphicsScene vs QGraphicsVie
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?
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
Danke schon mal,
ich versuche gleich mal mapToScene() zu verstehen. Zuvor aber Antworten auf deine Fragen (bzw. neue Fragen):
ich versuche gleich mal mapToScene() zu verstehen. Zuvor aber Antworten auf deine Fragen (bzw. neue Fragen):
Ist das schlimm? es gibt ja eh nur eine View.franzf hat geschrieben:Wenn du also von QGraoihcsView ableitest, nötigst du alle Nutzer, deine View zum Anzeigen zu verwenden.
Protected habe ich folgende reimplementiert:franzf hat geschrieben:Welche protected-Methoden von QGraphicsView verwendest verwendest du, welche reimplementierst du?
- 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);
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()?franzf hat geschrieben:Ginge das auch nur mit der Scene? Ginge es auch komplett OHNE Ableiten?
Re: Koordinatentransformation QGraphicsScene vs QGraphicsVie
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
Vielen Dank,
Filip
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
Vielen Dank,
Filip