Seite 1 von 1

DragAndDrop bei QTreeView

Verfasst: 30. September 2009 18:32
von mathies
Hallo,

ich habe einen QTreeView und möchte hier meine angezeigten Items verschieben. Ich habe im Konstruktor meiner abgeleiteten Klasse des QTreeView eigentlich Drag'n'Drop aktiviert:

Code: Alles auswählen

setDragDropMode(QAbstractItemView::DragDrop);
Ich kann zwar ein Item anwählen und verschieben, jedoch ist es mir nicht möglich dies an einer anderen Stelle zu platzieren. Muss ich dafür zusätzliche Funktionen selbst implementieren um dies zu ermöglichen oder fehlt mir nur ein Konfigeintrag?

Vielen Dank.

mathies

Verfasst: 30. September 2009 20:45
von Kratzy974
hmm, QAbstractItemView::InternalMove sollte vielleicht weiterhelfen. Dabei sollte auch die Sortierung auch aus sein. Ungetestet.

reicht nicht...

Verfasst: 1. Oktober 2009 10:30
von niyou
du musst mimeData und dropMimeDate implementieren...

hier ein älteres Beispiel von mir:

Code: Alles auswählen

QMimeData * FMITreeModel::mimeData(const QModelIndexList & indexes) const {
	QMimeData * ret = new QMimeData;
	long a = (long)indexes.at(0).internalPointer();
	QString result;
	QTextStream(&result) << a;
	qDebug() << result;
	ret->setData("application/x-qabstractitemmodeldatalist", QByteArray(result.toAscii()));
return ret;
}


bool FMITreeModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent){
	FMITreeItem * parentitem = getItem(parent);
	if (parentitem->elementTyp() == 2 || parentitem->elementTyp() == -1) return false;
	
	//item from Pointer in MimeData
	QString arg = QString(data->data("application/x-qabstractitemmodeldatalist").data());
	FMITreeItem * droppeditem = (FMITreeItem *) arg.toLongLong();
	
	bool nodeok = false;
	if (parentitem->elementTyp()==0) nodeok = parentitem->data(0)==droppeditem->parent()->data(0);
	else if (parentitem->elementTyp()==1) nodeok = parentitem->parent()->data(0)==droppeditem->parent()->parent()->data(0);

	if (nodeok==false) return false;
	
	//gleiches Kind finden
	FMITreeItem * uitem = parentitem->childByVal(droppeditem->data(0));
	
	emit layoutAboutToBeChanged();
	if (uitem == NULL) {
		//neu einfügen
		FMITreeItem * copy = new FMITreeItem (*droppeditem);
		copy->setParent(parentitem);
		parentitem->appendChild(copy);
	} else {
		//zweig updaten
		uitem->updateItemTree(droppeditem, 0);
		//saveIndex(parent);
	}
	emit layoutChanged();
	return true;
}
wie du siehst musst du dann natürlich auch noch überlegen was du mit dem verschobenen Zweig machst...wenn Du nur mit nem Pointer als Wert arbeitest, hast Du es einfach.

Gruß

niyou