Größenänderung und Transformationen mit GraphicsItem's
Größenänderung und Transformationen mit GraphicsItem's
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
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
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
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
-
-=Freaky=-
- Beiträge: 503
- Registriert: 29. Dezember 2006 22:54
- Wohnort: HL
-
-=Freaky=-
- Beiträge: 503
- Registriert: 29. Dezember 2006 22:54
- Wohnort: HL
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
(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
-
-=Freaky=-
- Beiträge: 503
- Registriert: 29. Dezember 2006 22:54
- Wohnort: HL
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
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
Sorry, wenn ich mich hier einklinke
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
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