Seite 1 von 1

Ein GraphicWidgetItem mehrmals verschieben

Verfasst: 3. Juli 2011 15:01
von CBM
Hallo,

was ich funktional umsetzen möchte:
In einer QGraphicsScene-Instanz befindet sich am Rand ein QGraphicsRectItem-Objekt. Von diesem Ausgangs-Item sollen sich beliebig viele Kopien z.B. durch ein Mouse-Event erzeugen lassen und diese Item-Kopien sollen sich auch frei in der Scene verschieben lassen ( ein Drag-and-Drop aus einem anderen Widget heraus wäre auch eine Möglichkeit).

Wie ich mir die Umsetzung vorstelle (offen zur Diskussion)
Es gibt ein Ausgangswidget in dem die Scene dargestellt wird. In dem Ausgangswidget gibt es eine Funktion "erzeugeRechteckItem()" zur Erzeugung der Items. Diese Funktion soll jedesmal neu aufgerufen werden, wenn eine weitere Kopie vom Ausgangs-Item erzeugt werden soll. Also dann, wenn das Ausgangs-Item angeklickt und verschoben wurde.

Dann gibt es noch eine Sub-Klasse "meineRechteckKlasse" abgeleitet von QGraphicsRectItem, da ich für das Verschieben den mouseReleaseEvent neu implementieren möchte.

Das erzeugen/kopieren eines weiteren Widgets durch das mouseReleaseEvent habe ich noch nicht umgesetzt, dann bereits wenn ich nur das Ausgang-QGraphicsRectItem-Objekt verschiebe zeigt sich schon ein Problem (siehe unten).

Also, das sieht bei mir dann so aus (vereinfacht):

Deklarationen in der Header-Datei

Code: Alles auswählen

class Ausgangswidget : public QWidget {
	Q_OBJECT

	public:
		Ausgangswidget(QWidget *parent = 0);
		~Ausgangswidget();
		void erzeugeRechteckItem(QGraphicsScene *scene);
};


 class meineRechteckKlasse : public QGraphicsRectItem {
	public:
	meineRechteckKlasse();
	protected:
		void mouseReleaseEvent (QGraphicsSceneMouseEvent *event);
};
Implementierungen in der Source-Datei (stark vereinfacht):

Code: Alles auswählen

 Ausgangswidget::Ausgangswidget(QWidget *parent) : QWidget(parent) {
       QGraphicsScene *front_scene = new QGraphicsScene;
       front_scene->setSceneRect( 0.0, 0.0, 300.0, 300.0 );

       erzeugeRechteckItem(anatomie_man_front_scene); //Diese Funktion soll später einmal durch den mouseReleaseEvent aufgerufen werden, um mehrere Items zu erzeugen
    
       QGraphicsView *darstellen = new QGraphicsView(front_scene, this);
	darstellen->setRenderHints( QPainter::Antialiasing );
}

void Ausgangswidget::erzeugeRechteckItem(QGraphicsScene *scene) {
	meineRechteckKlasse *rectangleItem = new meineRechteckKlasse;
	scene->addItem(rectangleItem);
}
Das Problem
Wenn der Konstruktur einmal durchlaufen ist, wurde ja die Funkltion "erzeugeRechteckItem(front_scene);" aufgerufen und mein Ausgangs-Item wie gewünscht erzeugt. 1x verschieben ist kein Problem. Will ich dieses nun neu positionierte Item erneut verschieben, dann verschwindet es und statt dessen bekommt man das Item dargestellt wie es ursprünglich vom Konstruktor positioniert wurde.

Irgendwie bin ich da gerade festgefahren, und bekomme meinen Kopf nicht mehr frei. Denke es hängt irgendwie mit dem Scope der Funktion zusammen, wo das Item erzeugt wurde. Aber mein Kopf schafft es nicht mehr zu einem zielgerichteten Lösungsansatz. Vielleicht kann mich mal jemand zumindest in die richtige Richtung schupsen.

Danke auch!!!
achja ... soll ich von der Idee vielleicht mal ein Bild zeichnen oder vesteht man aus dem Text was ich umsetzen will?