QT: Drag & Drop in ein Treemodel
-
Hi,
in der Darstellung wirkt es, wenn man ein Element zum Droppen über den Tree hält, dass er zwischen "auf Item schieben" und "zwischen die Zeilen schieben" unterscheidet. Im ersten Fall markiert er nämlich den ganzen Eintrag mit einer Box drum herum, im zweiten Fall ist der Eintrag zwar immer noch markiert, aber nur eine Markierungslinie ist zu sehen.
Ankommen tut aber in dropMimeData dasselbe... das ist natürlich bescheuert: Wenn ein Benutzer etwas zwischen zwei Zeilen schieben möchte, ist das doch etwas anderes als wenn er etwas in einen Ordner schiebt.
Hat da jemand eine Idee? Ich habe schon viel gesucht, aber nichts Gescheites gefunden.
Ich habe jetzt (nur) diesen Thread gefunden: http://stackoverflow.com/questions/6942098/qt-qtreeview-only-allow-to-drop-on-an-existing-item
Der Autor will, dass man eben NICHT zwischen Items schieben kann und sucht nach Unterscheidungsmethode. Für ihn funktioniert Folgendes:
I've found a much easier way now which does exactly what I want. Reimplement the flags method of the underlying model to return Qt::ItemIsDropEnabled only if passed index is valid. When in between items, flags() is called with an invalid index so I can decide not to accept the drop.
Das trifft bei mir aber nicht zu. Falls ich zwischen den Zeilen bin, liefert er trotzdem einen korrekten Index (im anderen Fall ist DropEnabled nämlich auch aus, wie ich gerade sah). Er läuft aber jedes Mal ins dropEvent rein... Muss ich vielleicht bei dropEvent(.) selbst die Flags prüfen? Ich sah bisher nur keine solche Implementierung.
Beste Grüße,
Eisflamme
-
Eisflamme schrieb:
Ankommen tut aber in dropMimeData dasselbe...
Sicher? Das glaub ich nicht... Ich hab die Funktion dropOn in QAbstractItemView kurz überflogen und ich meine, es müsste schon funktionieren. Probiers mal aus, oder debug da rein.
-
dropOn schaue ich mir Mal an, danke!
Edit:
Super, hat geklappt. dropOn nutzt viele Funktionen einer privaten Klasse, daher hätte ich das jetzt ungern nachgebaut. Habe jetzt in meinem dropEvent() aber einfach das dropEvent() der anderen Klasse verwendet. Ist wohl absolut zu empfehlen, damit man nicht so falsches, eigenes Fehlverhalten einbaut.Vielen Dank!