[gelöst] QGraphicsView verschieben mit translate(dx, dy)

Alles rund um die Programmierung mit Qt
Antworten
René
Beiträge: 75
Registriert: 15. August 2006 11:14
Kontaktdaten:

[gelöst] QGraphicsView verschieben mit translate(dx, dy)

Beitrag von René »

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:

Code: Alles auswählen

QGraphicsPixmapItem *pixmapItem = _graphicsScene->addPixmap(pixmap.scaled(220, 315, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
pixmapItem->setOffset(i * (220 + 15), 0);
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 ich

Code: Alles auswählen

_graphicsView->translate(dx, dy);
und testhalber mal

Code: Alles auswählen

_graphicsView->rotate(angle);
und

Code: Alles auswählen

QTransform transform;
transform->translate(dx, dy);
_graphicsView->setTransform(transform);
ausprobiert. 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.
Zuletzt geändert von René am 10. August 2008 13:55, insgesamt 1-mal geändert.
René
Beiträge: 75
Registriert: 15. August 2006 11:14
Kontaktdaten:

Beitrag von René »

Ok, nun wird die Translation ausgeführt, aber nur, wenn ich mindestens einen Scrollbalken darstelle, und diesen manuell mittels Mauszeiger etwas verschiebe. Setze ich den Scrollbalken wieder auf die ursprüngliche Position zurück, also beispielsweise ganz links für einen horizontalen Slider, funktioniert die Translation wieder nicht.

Ich finde dieses Verhalten äußerst seltsam, ich habe im BugTracker bei Trolltech gesucht und tatsächlich einen Eintrag mit genau dem eben beschrieben Verhalten gefunden, aber der Status steht auf Closed, Solution ist rejected. Ich werde aus dem, was da steht nicht schlau:

http://trolltech.org/developer/task-tra ... &id=128778
René
Beiträge: 75
Registriert: 15. August 2006 11:14
Kontaktdaten:

Beitrag von René »

Hehe, Problem gelöst. Um die Items weiter rechts sehen zu können, muss man ja eine Links-Verschiebung durchführen, dazu muss dx negativ sein. Das war's. Alle anderen angeblichen Workarounds kann man getrost weglassen. :)
Antworten