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:
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