Größenänderung und Transformationen mit GraphicsItem's

Alles rund um die Programmierung mit Qt
Antworten
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Größenänderung und Transformationen mit GraphicsItem's

Beitrag von NoRulez »

Hi @all,

Ich habe einen kleinen Zeichnugseditor für mich begonnen und hätte dazu 2 Fragen:
1.) Wie kann ich Objekte erstellen, die die Größen automatisch ändern? Mit automatisch ändern meine ich, das ich beispielsweise bei einem Rechteck irgendwo in die GraphicsScene klicke und dann das Rechteck erstelle/ziehe, so da man dann beispielsweise eben mehrere verschieden große Rechtecke hat?
2.) Gibt es irgendeine fertige Funktion, die einen Rahmen um ein solches Objekt erstellt, mit der man dann die Größe verändern und die Objekte drehen kann? Meine hier so ein rechteck mit den 8 kleinen schwarzen rechtecken wie es in jedem anderen Zeichnungsprogramm vorhanden ist?

Ich habe mir bereits das diagram scene beispiel angesehen, aber hier werden die genannten funktionen leider nicht verwendet.

Hoffe das mir diesbezüglich jemand helfen/unter die Arme greifen kann.

Vielen Dank im Voraus
LG NoRulez
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

vorweg: alle angaben ohne gewaehr, keine ahnung ob meine ansaetze sinnvoll sind.

1. entspr. mouse events reimplementieren, dann das delta auf beiden achsen bilden und ein entspr. grosses rechteck erstellen.
QRubberBand oder ein eigenes QGraphicsRectItem oder so etwas koenntest du vllt. zur anzeige benutzen, oder eben das rechteck sofort erstellen und die groesse dann mit der mausbewegung direkt aendern (im mouseMoveEvent).

2. etwas aehnliches habe ich mal gebaut. so ein fertiges item gibt es soweit ich weiss nicht.
ich habe
- ein eigenes item von QGraphicsRectItem abgeleitet
- dieses item enthielt versch. child-items als "handles", z.b. in den ecken zum aendern der groesse
- die handles waren nur sichtbar, wenn das item selektiert war (entspr. flag: QGraphicsItem::ItemIsSelectable ... oder so aehnlich)
- dort mousePress-/release-/move-event reimplementiert:
im mousePressEvent checken, ob in eines der "handles" geklickt wurde, und ob das item selektiert ist (also die handles sichtbar).
falls ja, ein internes flag setzen, als beispiel dann beim klick in ein handle zur groessenaenderung: m_state = RESIZING oder irgendwie so, und natuerlich die position des klicks (des events) in der klasse speichern
im mouseMoveEvent dann checken, was gerade gemacht wird (bspw. RESIZING) und entspr. aus der gespeicherten und der aktuellen position errechnen, um wieviel das item vergroessert (bzw. rotiert oder sonstwas) werden soll.
im mouseReleaseEvent dann den "status" wieder zuruecksetzen (d.h. m_state = NOTRANSFORMATION oder so).

hoffe das ist einigermassen verstaendlich. notfalls koennte ich gucken ob ich die klasse noch hab und hier posten.

mfg,
julian
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

Vielen Dank für Deine ausführliche Beschreibung,

wäre sehr nett wenn Du mir ein Beispiel oder Deine Klasse posten könntest, damit ich was anschauliches zum Verstehen habe.

LG NoRulez
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

morgen kann ich vllt. mal was posten wenn ich etwas zeit habe.

mfg,
julian
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

so ich hab mal testweise nochmal sowas implementiert. der code ist hier und da kommentiert, ich hoffe das reicht, ansonsten frag hier nochmal nach.
(demoprojekt im anhang)

2 abgeleitete klassen:
- GraphicsScene, um bei mausklick items in der scene zu erstellen (ich bin mir nicht ganz sicher, obs nun sinnvoller ist, dafuer QGraphicsScene oder QGraphicsView abzuleiten, aber nach meinem verstaendnis finde ich QGraphicsScene naheliegender)
- RectItem als rechteckiges item mit handles zum aendern der groesse und rotieren

mfg,
julian
Dateianhänge
GraphicsItemMouseTransform.zip
(5.14 KiB) 274-mal heruntergeladen
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

Vielen herzlichen Dank,

ich werde es mir mal übers Wochenende anschauen.

LG NoRulez
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

kein problem, gerne.
irgendwas klappt mit dem selektieren der RectItems nicht so ganz aber darum gehts ja nicht, koennte man darin noch fixen.
ausserdem koennte man das ganze im mouseMoveEvent abhaengig von event->scenePos und event->lastPos machen, damit waere dann ein zwischenspeichern der mausposition im mousePressEvent ueberfluessig.
.. aber auch das nur als optimierungsvorschlag, es funktioniert auch so wie es in dem code steht.

mfg,
julian
mabralume
Beiträge: 39
Registriert: 26. April 2007 11:54
Wohnort: Siegen
Kontaktdaten:

Beitrag von mabralume »

Sorry, wenn ich mich hier einklinke :oops:

Aber Deine Idee @-=Freaky=- find ich super und wollt fragen, ob ich die für meine Zwecke auch verwenden darf. :?:

Ich würde damit gerne schon vorhandene Items auf ner GraphicsView verschieben und in der Größe ändern. Bei den ProxyWidgets fehlt mir nämlich eine Anzeige, ob das Element selektiert wurde. Ich würde gerne Dein RectItem "drüberlegen" und die Move/Resizing Ereignisse an das ProxyWidget weiterleiten.

mfg
MB
Ein Programmierer ist ein Tool, was Coffein in Code umwandelt.
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

moin mabralume,
ja klar, wenn du damit irgendwas anfangen kannst, kannst du das uebernehmen, zerhackstueckeln, vergewaltigen, ... wie du moechtest. ;)
wenn die hilfen am ende niemand verwenden darf, muss ich ja gar nicht erst hier posten ;)

mfg,
julian
mabralume
Beiträge: 39
Registriert: 26. April 2007 11:54
Wohnort: Siegen
Kontaktdaten:

Beitrag von mabralume »

Alles Klar ! :D thx

mfg
MB
Ein Programmierer ist ein Tool, was Coffein in Code umwandelt.
Antworten