Seite 1 von 1

QGraphicsView dropEvent

Verfasst: 27. August 2007 18:14
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.

Re: QGraphicsView dropEvent

Verfasst: 25. Oktober 2011 08:00
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