[gelöst] QGraphicsView verschieben mit translate(dx, dy)
Verfasst: 10. August 2008 12:41
Hallo,
ich habe ein QGraphicsView Objekt, welches ein QGraphicsScene Objekt darstellt. Die Szene enthält mehrere QGraphicsPixmapItems die beispielsweise 220 Pixel breit sind und in einem Abstand von 15 Pixel hintereinander (in einer Reihe) liegen.
Realisiert habe ich das mit:
Die Variable i ist mein Schleifenzähler, innerhalb der Schleife werden alle pixmap Objekte der Szene hinzufügt.
Mein QGraphicsView Objekt ist nur genauso groß, das gerade ein QGraphicsPixmapItem dargestellt werden kann, also 220x315 Pixel. Mittels QTimer möchte ich nun mein View bei jedem Trigger so verschieben, dass das nächste QGraphicsPixmapItem zu sehen ist. Später möchte ich diese eine Verschiebungsopertion zerlegen in Pixel-weise Verschiebungen, die mittels QTimeLine gesteuert werden sollen, um somit ein paar hübsche Animationen zu erreichen.
Im Moment jedoch funktioniert erstmal die simple Translation nicht. Dazu habe ichund testhalber mal undausprobiert. Das einzige was auf Anhieb funktionierte war das Rotieren um einen beliebigen Winkel. Aber ein Verschieben konnte ich nicht erreichen. Es passiert einfach nichts.
Ich habe etwas gegoogelt und von jemandem gelesen, der ebenfalls zunächst damit Probleme hatte und es dann lösen konnte indem er mittels setSceneRect die Szene deutlich vergrößerte und den TransformationAnchor auf Qt::NoAnchor setzte. Doch das brachte bei mir keine Änderung.
Da mein View kleiner als meine Szene ist, habe ich natürlich Scrollbars, die ich allerdings mittels Policy abgeschaltet habe, der User soll keinen direkten Zugriff auf das View haben. Ich hatte diese Policy zu Testzwecken mal wieder zurückgenommen, aber auch das brachte (natürlich) keinen Erfolg.
Kann mir da jemand helfen?
P.S.: Was dagegen hervorragend funktioniert ist die Szene so zu verschieben, dass das gewünschte QGraphicsPixmapItem mittels centerOn(QGraphicsItem) mittig im View dargestellt wird. Das erzeugt im Prinzip genau den Effekt, den ich zunächst erreichen möchte. Allerdings hilft mir das nicht weiter, wenn ich die Verschiebung in viele Pixel-weise Verschiebungen zerlegen möchte um sie mittels QTimeLine zu steuern.
ich habe ein QGraphicsView Objekt, welches ein QGraphicsScene Objekt darstellt. Die Szene enthält mehrere QGraphicsPixmapItems die beispielsweise 220 Pixel breit sind und in einem Abstand von 15 Pixel hintereinander (in einer Reihe) liegen.
Realisiert habe ich das mit:
Code: Alles auswählen
QGraphicsPixmapItem *pixmapItem = _graphicsScene->addPixmap(pixmap.scaled(220, 315, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
pixmapItem->setOffset(i * (220 + 15), 0);Mein QGraphicsView Objekt ist nur genauso groß, das gerade ein QGraphicsPixmapItem dargestellt werden kann, also 220x315 Pixel. Mittels QTimer möchte ich nun mein View bei jedem Trigger so verschieben, dass das nächste QGraphicsPixmapItem zu sehen ist. Später möchte ich diese eine Verschiebungsopertion zerlegen in Pixel-weise Verschiebungen, die mittels QTimeLine gesteuert werden sollen, um somit ein paar hübsche Animationen zu erreichen.
Im Moment jedoch funktioniert erstmal die simple Translation nicht. Dazu habe ich
Code: Alles auswählen
_graphicsView->translate(dx, dy);
Code: Alles auswählen
_graphicsView->rotate(angle);Code: Alles auswählen
QTransform transform;
transform->translate(dx, dy);
_graphicsView->setTransform(transform);Ich habe etwas gegoogelt und von jemandem gelesen, der ebenfalls zunächst damit Probleme hatte und es dann lösen konnte indem er mittels setSceneRect die Szene deutlich vergrößerte und den TransformationAnchor auf Qt::NoAnchor setzte. Doch das brachte bei mir keine Änderung.
Da mein View kleiner als meine Szene ist, habe ich natürlich Scrollbars, die ich allerdings mittels Policy abgeschaltet habe, der User soll keinen direkten Zugriff auf das View haben. Ich hatte diese Policy zu Testzwecken mal wieder zurückgenommen, aber auch das brachte (natürlich) keinen Erfolg.
Kann mir da jemand helfen?
P.S.: Was dagegen hervorragend funktioniert ist die Szene so zu verschieben, dass das gewünschte QGraphicsPixmapItem mittels centerOn(QGraphicsItem) mittig im View dargestellt wird. Das erzeugt im Prinzip genau den Effekt, den ich zunächst erreichen möchte. Allerdings hilft mir das nicht weiter, wenn ich die Verschiebung in viele Pixel-weise Verschiebungen zerlegen möchte um sie mittels QTimeLine zu steuern.