GraphicsItems mit Mouse editieren

Alles rund um die Programmierung mit Qt
Antworten
VuuRWerK
Beiträge: 82
Registriert: 11. Juni 2007 20:46
Wohnort: Dresden

GraphicsItems mit Mouse editieren

Beitrag von VuuRWerK »

Hallo Ihrs,

ich hab auch bei diesem Problem schon die Suchmaschine strapaziert, zwar schon etwas gefunden, was jetzt zwar nicht das macht was ich vor habe jedoch darauf hinauszielt, jedoch wollte ich auch hier nochmal nachfragen um es nicht unversucht zulassen.

Ich möchte gern ein GraphicItems mit der Mouse bearbeiten, d.h. transformieren, rotieren, etc. Jetzt würde ich von QAbstractGraphicsShapeItem erben und bei einem mousePressEvent das item selektiert darstellen, also an den Ecken und Kannten jeweils ein kleines schwarzes Viereck(auch eigene Items) und beim mousePressEvent und mouseMoveEvent der Vierecke das jeweilige selektierte Item/ItemGroup transformieren, rotieren, etc. Einzige was mich daran jetzt stört: Ich müsste alle QGraphics*Item nach implementieren da ich es genau für diese Shapes brauche diese mir aber dafür leider nichts anbieten (Ich könnte maximal noch jedes Item was ich so editieren will doppelt überladen, einmal vom entsprechenden QGraphics*Item und einmal von einem von mir definierten Interface zum handeln der mouse*Events).

Jetzt wollte ich aber vorher fragen ob jemand eventuell weiß ob nicht sowas/ähnliches im QtCore schon implementiert ist? Ich habe nix diesbezüglich gefunden kann mir es auch nicht richtig vorstellen da es schon etwas zu spezielles ist für ein Framework. Aber man weiß ja nie, Qt hat ja so einige Schmankerl unter der Haube die schon für recht spezielle Sachen dienen.

Falls jemand ein paar Hinweise hat würde ich mich sehr freuen, vielleicht auch noch Ideen zu meinem Vorschlag, ansonsten fange ich heut Abend an meine Idee umzusetzen :)

Gut Schuß
VuuRWerK ;)
Es gibt nur 3 natürliche Feinde des Programmierers: Tageslicht, frische Luft und das unerträgliche Gebrüll der Vögel.
Oft ist die Ursache des schwarzsehens lediglich ein verrutschen des Bretts vorm Kopf =)
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Machs dir doch nicht so schwer ;)
Schreib dir einfach ein ControllerItem, welchem du das zu transformierende Item übergibst (alternativ gehts sicherlich auch mit ner Gruppe von Items).
Dieses erstellst du vllt. im mousePressEvent deiner Scene/View.
Das ControllerItem malt entlang dem boundingRect des Items die Punkte zum vergößern/rotieren (Punkte evtl. eigene GraphicsItems, dann ist Position abfragen ein Klacks). beim Verschieben der Punkte kannst du entsprechend dein kontrollierstes Item verändern.
(Hoffe das ist so leicht wie ich mir das grad überlegt hab :D - also nicht getestet)

Grüße
Franz
VuuRWerK
Beiträge: 82
Registriert: 11. Juni 2007 20:46
Wohnort: Dresden

Beitrag von VuuRWerK »

Ha! :) So wollte ich es ja auch erst machen allerdings musste ich feststellen als ich ein QGraphicsRectItem skalieren wollte das dies nicht mit scale(scalex, scaley) oder setTransform oder setMatrix ging, sondern nur mit setRect und das hat bekanntlich nur das QGraphics[Rect|Ellipse]Item, die Linie hat setLine der Path setPath:)

Daher kann ich das ganze nicht so allgemein für jedes QGraphicsItem machen wie ich es natürlich auch erst machen wollte. Das ist ja auch einer der Gründe warum ich es hier geschrieben habe um nicht doch noch etwas zu finden was ich übersehen haben könnte.

Aber danke für Dein Tipp, so würde ich es ja auch gern machen wollen, sofern ich meine "Transformationsarbeiten" auf alle QGraphicsItems anwenden kann, was aber nach meinen Recherchen und Tests anscheinend nicht geht. :(

Gut Schuß
VuuRWerK ;)
Es gibt nur 3 natürliche Feinde des Programmierers: Tageslicht, frische Luft und das unerträgliche Gebrüll der Vögel.
Oft ist die Ursache des schwarzsehens lediglich ein verrutschen des Bretts vorm Kopf =)
VuuRWerK
Beiträge: 82
Registriert: 11. Juni 2007 20:46
Wohnort: Dresden

Beitrag von VuuRWerK »

Ok, da ich mir irgendwie nicht vorstellen konnte warum es nicht ging mit dem skalieren über das setzen der Matrix habe ich jetzt nochmal fix ein kleines Beispiel zusaamengehacked und siehe da es geht ja doch, aber ich hatte es vorher immerschon mit der Mouse probiert und da hat sich nix geregt, müsste ich mal tüfteln warum.

Der Code funktioniert, genauso hatte ich es vorher im mouseevent nur eben nicht mit konstanten werten sondern berechnet mit den MosueCoordinaten aber da ging nix, da blieb einfach nur ein 1x1px großer Punkt ...

Code: Alles auswählen

QGraphicsItem* item = new QGraphicsRectItem(QRectF(50, 50, 200, 100), NULL, scene_);
scene_->addItem(item);
QMatrix matrix;
matrix.scale(0.5, 0.5);
item->setMatrix(matrix);
Gut Schuß
VuuRWerK ;)
Es gibt nur 3 natürliche Feinde des Programmierers: Tageslicht, frische Luft und das unerträgliche Gebrüll der Vögel.
Oft ist die Ursache des schwarzsehens lediglich ein verrutschen des Bretts vorm Kopf =)
Antworten