Drag&Drop mit QTreeView -> keine Selektion

Alles rund um die Programmierung mit Qt
Antworten
TBerger
Beiträge: 27
Registriert: 12. März 2007 09:47
Wohnort: Karlsruhe

Drag&Drop mit QTreeView -> keine Selektion

Beitrag von TBerger »

Hallo,

ich möchte Drag&Drop in meinem modell-basierten QTreeView realisieren. Genaugenommen geht es darum, Elemente von einem Baum in einen anderen zu ziehen. Dazu habe ich die QTreeViews abgeleitet, und die entsprechenden Methoden überschrieben, rein datenmäßig klappt das Drag&Drop auch. Allerdings werden beim Rüberziehen des Elements nicht die Elemente im Zielbaums selektiert (d.h. gehighlightet), so wie man das eigentlich erwartet. Es gibt also kein Feedback, auf welchen Knoten man dass Element nun zieht, was sehr störend ist.
Was muss man tun? Muss im Zielbaum noch eine Weitere Methode überschrieben werden, oder ein bestimmtes Flag umgesetzt werden?

Dann hätte ich noch eine weitere Frage: Mein QTreeView ist mit einem Modell verknüpft, das von QAbstractItemModel abgeleitet ist. Wenn ich die Objekte in meiner Datenbasis anlege, bevor das Widget bzw. das Fenster angezeigt wird, funktioniert alles. Wenn ich danach allerdings meinen Datenbestand ändere auf den das Model ja mit den index()-Methoden usw. zugreift, wird der Baum nicht geupdatet. Woran liegt das? Es wird doch eigentlich bei fast jedem Klick das Model bemüht, die aktuellen Daten zu holen. Das Debugging zeigt auch, dass die neue Zeilenanzahl usw. eingelesen wird (rowCount), allerdings werden dann keine neuen Indexe erstellt (d.h. index() wird nicht aufgerufen, und somit auch die Zeilen nicht in der GUI angezeigt ???

Vielen Dank für eure Hilfe!
Thomas
Sephral
Beiträge: 201
Registriert: 1. Februar 2006 09:40
Kontaktdaten:

Beitrag von Sephral »

Hallo,

Zu Deiner 1. Frage:
Schau Dir einfach mal "QItemSelectionModel" an. Damit könntest du das neu eingefügte Item markieren.

Zu Deiner 2. Frage:
Schau Dir mal das Signal "void layoutChanged ()" vom QAbstractItemModel an. Bei mir klappt es damit.


Ciao,
Sephral
TBerger
Beiträge: 27
Registriert: 12. März 2007 09:47
Wohnort: Karlsruhe

Beitrag von TBerger »

Aha, vielen Dank schon mal für die Tipps.
Allerdings:

zu 1.) Ich verwende bereits ein SelectionModel, allerdings habe ich mich mißverständlich ausgedrückt: Ich möchte nicht das Item markieren, das eingefügt wurde, sondern während der Benutzer noch 'draggt', die bereits vorhanden Knoten markieren, wenn er das Item drüberhält.
So wie wenn ich im Windows-Explorer eine Datei in einen Ordner ziehe, dann wird ja auch der Zielordner markiert.
Ich versuche das so:

Code: Alles auswählen

void MyDropQTreeView::dragMoveEvent(QDragMoveEvent* event) {
	
	if (event && event->mimeData()) {
		...
                 QModelIndex index = indexAt(event->pos());
		selectionModel()->setCurrentIndex(index, QItemSelectionModel::Toggle);
		...
		const QMimeData* md = event->mimeData();
		if (md->hasText()) {
			event->acceptProposedAction();
		}

	}
}
Allerdings macht selectionModel()->setCurrentIndex(index, QItemSelectionModel::Toggle) nicht wirklich etwas...
TBerger
Beiträge: 27
Registriert: 12. März 2007 09:47
Wohnort: Karlsruhe

Beitrag von TBerger »

Okay,

1) hat sich jetzt erledigt. Ich hatte QItemSelectionModel abgeleitet und die select-Methode überschrieben ohne die richtigen Signale zu senden. Daher hat die Markierung auch nicht funktioniert.
Antworten