DragAndDrop bei QTreeView

Alles rund um die Programmierung mit Qt
Antworten
mathies
Beiträge: 149
Registriert: 9. Februar 2007 17:50
Wohnort: Erfurt

DragAndDrop bei QTreeView

Beitrag 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
Kratzy974
Beiträge: 23
Registriert: 29. September 2009 13:25

Beitrag von Kratzy974 »

hmm, QAbstractItemView::InternalMove sollte vielleicht weiterhelfen. Dabei sollte auch die Sortierung auch aus sein. Ungetestet.
niyou
Beiträge: 13
Registriert: 26. Juni 2009 08:28

reicht nicht...

Beitrag 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
Antworten