Seite 1 von 1

QTreeWidget Drop auf Viewport verhindern

Verfasst: 29. August 2017 15:43
von JulyDA
Hallo Zusammen,

ich habe für die Drag&Drop Funktion eine Klasse von QTreeWidget abgeleitet (namens MyTreeWidget) und möchte nun verhindern, dass die Child-Items auf den Viewport gedropped werden können, sondern nur innerhalb ihres Parents.

Mein Problem: Bei Berührung des Viewports mit einem Child-Item werden alle weiteren Drag Versuche gesperrt, unabhängig davon, was ich wohin droppen möchte.

Ich habe die Vermutung, dass es an dem event->ignore() liegt, jedoch finde ich keine andere Möglichkeit den Drop zu verhindern. Hatte jemand bereits ein ähnliches Problem oder kennt eine bessere Lösung?

Grüße,
July

Meine MyTreeWidget Klasse sieht so aus:

Code: Alles auswählen

MyTreeWidget::MyTreeWidget(QWidget *parent) : QTreeWidget(parent){}

void MyTreeWidget::dragMoveEvent(QDragMoveEvent *event){
	QAbstractItemView::DropIndicatorPosition dropIndPos = this->dropIndicatorPosition();

	if(dropIndPos==QAbstractItemView::OnViewport){
		event->ignore();
		return;
	}else{
		QTreeWidget::dragMoveEvent(event);
	}
}
Im TreeWidget habe ich folgende Einstellungen gesetzt (alle anderen stehen auf ihren Default Werten):

dragDropMode = InternalMove
dragEnabled = true
showDropIndicator = true
selectionBehavior = SelectItems

Re: QTreeWidget Drop auf Viewport verhindern

Verfasst: 29. August 2017 18:50
von Christian81
Wenn Du das Event ignorierst ist es natürlich vorbei.
http://doc.qt.io/qt-5/qdragmoveevent.html#details -> vielleicht hilft void QDragMoveEvent::ignore(const QRect &rectangle) weiter.

Re: QTreeWidget Drop auf Viewport verhindern

Verfasst: 30. August 2017 12:10
von JulyDA
Hallo,
danke für deine Antwort.

Zum Verständnis: Ignore ist doch die einzige Möglichkeit, um das Event abzulehnen oder?

Ich habe deinen Vorschlag ausprobiert und ein QRect mit den Koordinaten des Viewports erstellt. Aber der Fehler bleibt der Gleiche. Sobald event->ignore(vpRect); ausgeführt wurde, werden alle weiteren Dropversuche auch abgelehnt. :?

Ich habe auch versucht das Event zu umgehen und die Möglichkeit über das Widget via twExample->viewport()->setAcceptDrops(false); zu verhindern, aber auch das hat alle Drop Versuche blockiert..