QGraphicsView dropEvent

Code-Schnippsel, oder Tipps und Tricks, die einem beim Programmieren mit Qt helfen können.
Antworten
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

QGraphicsView dropEvent

Beitrag von Volker »

Ich stand gerade vor dem Problem, dass ich in einer Klasse die von QGraphicsView abgeleitet ist, die Funktion dropEvent ( QDropEvent * event ) überschreiben wollte. Funktioniert auch wunderbar, so lange keine QGraphicsScene gesetzt ist. Danach wird zwar noch die dragEnterEvent(QDragEnterEvent *event) Methode aufgerufen,
aber dropEvent wird von der QGraphicsView Implementierung verschluckt, die leider nicht virtual ist. Möchte man z.B. aus einer Liste einen Eintrag in eine QGraphicsScene ziehen um dort ein neues Item hinzuzufügen, hat man ein Problem.

Die Lösung des Problems:

Man implementiere die folgenden Funktionen in seiner Klasse die von QGraphicsView abgeleitet ist:

Code: Alles auswählen

void MyView::dragEnterEvent(QDragEnterEvent *event)
{
	if (event->mimeData()->hasFormat("MyView/data"))
	{
		event->acceptProposedAction();
		setInteractive(false);
	}
	event->accept();
}

void MyView::dropEvent ( QDropEvent * event )  
{
	switch(event->dropAction())
	{
	     ....
	};
	setInteractive(true);
	event->accept();
}

void MyView::dragLeaveEvent ( QDragLeaveEvent * event )
{
	setInteractive(true);
	event->accept();
}
Da in der Implementierung von QGraphicsView der dropEvent ignoriert wird so lange interactive auf false steht, wird seltsamerweise wieder die Implementierung meiner eigenen Klasse aufgerufen.
Der Trick ist also das Interactive Flag der View Klasse so lange auf false zu stellen wie man mit seinen eigenen externen Mimedaten arbeitet.
Nachdem es so funktioniert hab ich mich nicht weiter mit den Hintergründen beschäftigt, ob das Sinn ergibt oder eher ein Bug in QT ist.
Da ich mir aber dachte, dass evtl. mal jemand vor ähnlichen Problemen steht, poste ich hier mal im Tips & Tricks Bereich meine Lösung.
Wenn jemand Probleme sieht das ganze wie oben beschrieben zu lösen, bitte ich um Feedback.
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
Arocz
Beiträge: 18
Registriert: 3. Februar 2010 09:06
Wohnort: Edermünde Besse

Re: QGraphicsView dropEvent

Beitrag von Arocz »

in Qt 4.7.3 hatten wir nun das selbe Problem.

Unser vererbter QGraphicsView hat auch das dragEnterEvent geworfen, danach kamen dragMove und dragLeave, allerdings nicht das dropEvent.

Was uns dabei schon auffiel: Das "gedraggte" Item gibt in der Vorschau schon die Rückmeldung(Mauszeiger) über dem Widget, dass es nicht gedropped werden kann.

Lösung des Problems ist, im dragMoveEvent event->accept() aufrufen.
Dann kommt das dropEvent.

Grüße
Antworten