Seite 1 von 1

QTreeView - Drag & Drop - dropIndicatorPosition

Verfasst: 13. März 2009 14:35
von CLRS530
Ich bin gerade dabei Dragn Drop in meinem Projekt zu unterstüzen. Ich bin derzeit noch bei den Vorbereitungen, ohne wirkliche Daten auszutauschen.

(1)
Mir ist schleierhaft, wie ich den Drop Indikator steuern kann. Das heißt, ich möchte nur bedingt zulassenm, dass auf ein Item gedropped werden kann (sich ein Kasten um das Item bildet).
Ich habe aber nur folgendes gefunden: http://doc.trolltech.com/4.5/qabstracti ... orPosition und der Sinn dieser Funktion bleibt mir auch verschlossen. Sinn machen würde es, wenn ich in dropMimeData des Models die Indikator position mit übergeben bekommen würde. Aber dem scheint nicht so zu sein.

(2)
Ich habe das QTreeView auf ZEILENselektierung gestellt, der Drop Indikator markiert trotz allem nur eine Zelle. Kann das geändert werden?

Verfasst: 14. Juli 2009 16:16
von niyou
wenn du noch Hilfe brauchst meld dich...
...mich würd interessieren wie Du generell das drag und drop realisierst.

Niyou

Verfasst: 22. Juli 2009 01:48
von CLRS530
Erst mal vielen Dank für die Antwort.
War schon lustig, dass ich genau an dem Tag deines Posts hier wieder reingeschaut hatte mit dem Gedanken das Projekt nach langer Zeit wieder aufzunehmen, welches ich Aufgrund nervig- schweren Problemstellungen und anderen interessanteren Dingen eingestellt hatte.
Ich habe es an dem Tag leider nicht geschafft den Zustand meines ersten Posts wieder herzustellen, da ich dort noch einiges herum gespielt und zwischenzeitlich wieder deaktiviert habe.
Ich weiß nicht inwiefern ich dein Interesse deuten soll, meinst du mir helfen zu können, möchtest du selbst Anregungen oder wie?
Drag und Drop muss ich auf ziemlicher Low Level Ebene realisieren, da es eine doch recht vielschichtige Geschichte wird. Außerdem läuft es auf der Ebene eines Custom Models. Ich bin wie gesagt nie richtig weit vorgedrungen und habe erst einmal nur den Rahmen eingerichtet, aber die Steuerung funktioniert eigentlich durch die 3 Funktionen flags, dropMimeData und mimeData von QAbstractItemModel.
Ich hoffe das bringt dich ein bisschen weiter.

Verfasst: 22. Juli 2009 14:36
von niyou
Naja zum Thema Dropindikator hab ich für mich ne Lösung gefunden...

...und das Drag n Drop läuft jetzt bei mir schon...ich werd aber wohl alles nochmal über den Haufen schmeißen und mit Pointern auf mein bereitsbestehendes Datenmodell arbeiten.

Niyou

Verfasst: 22. Juli 2009 18:08
von CLRS530
Hört sich gut an. Ich würde generell gerne eine Drag und Drop Implementation sehen. Die Beispielsachen sind mir zu fern der Realität, weil für viel zu simple Dinge.
Ist deins vielleicht ein Open Source Projekt oder könntest du ein paar vereinfachte Funktionen reinschreiben um es zu verdeutlichen?
Ansonsten eine Erklärung mit dem Drop Indikator etc. würde sicherlich auch helfen :).

Verfasst: 23. Juli 2009 10:31
von niyou
ist kein OpenSource - also kann ich nur begrenzt Beispiele zeigen:

Ich habe meine Item um zusätzliche Daten erweiter - z.B. ElementTyp. Den DropIndikator gebe ich dann Typabhängig zurück -> Code aus meinem Abgeleitetem QAbstaractItemModel:

Code: Alles auswählen

Qt::ItemFlags FMITreeModel::flags(const QModelIndex &index) const
{
    if (!index.isValid())
        return 0;
	if (getItem(index)->elementTyp()==2 && index.column()==1) return Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable;
	return Qt::ItemIsDragEnabled |Qt::ItemIsDropEnabled |Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}
Beim DragNDrop übergebe ich nur einen Pointer auf das gedraggte Item - also gestaltet sich der erste Teil recht einfach:

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;
}
Vielleicht ist das ja schon ein wenig hilfreich. Ich werde jetzt erstmal das ganze wie angekündigt umstellen...

Verfasst: 23. Juli 2009 13:50
von CLRS530
Da sehe ich noch nichts groß neues, zu mindestens habe ich es nicht gefunden. Wo steuerst du den DropIndikator?