[Solved] QSqlTableModel und Drag'n'Drop
-
Sorry, ich hab dein Edit-Code-Beispiel erst jetzt gesehen, da hatte ich schon geantwortet. Ja, zu 90% sah mein Code auch so aus.
Nur das hatte ich nicht.if (m_maxItems == size()) /* HIIIIIIIIIIIIIER */ return false;
Dort hatte ich eben ein z++; und hab eben in den supportedDropActions geschaut ob z > m_maxPlatz wird.
Und das size() meint der Kompiler ist nicht deklariert in dem Scope. Mal ganz abgesehen davon das ich so ziemlich jede Variante durchversucht haben mit parent und QModelIndex an irgend ne verwertbare Größe zu kommen und was weiß ich nicht alles, ich komme eben nun mal nicht an die Size der Stringliste .... aber ich tu mein bestes das noch rauszufinden .....
EDIT sagt: Ok ich sehe du hast dein Posting nochmal abgeändert, dann vergiss erstmal was ich geschrieben habe ... ich setze erstmal um was ich nun daraus an erkenntniss gewonnenhabe, sieht grad gut aus
-
Sooo .... nach 3 Bissen in die Tischkante funktioniert nun alles ....
Erstmal hatte ich das Problem das m_maxPlatz irgendwie nicht größer als -1 wurde .... bis mir dann auffiel das ich aus deinem Codebeispiel von Seite 1 noch folgendes hatte
m1 = new DragDropStringListModel(QString("1,2,3,4,5,6").split(","), this); m2 = new DragDropStringListModel(QStringList(), this);
Nach 5 mal durchlesen und verzweifeln das abgeändert .... und fast am Ziel gewesen. Dann blieb folgendess Problem - wenn ich die Überprüfung auf size>m_maxPlatz wirklich in die
bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
Funktion packe, und die size+1>maxPlatz wird, ist es egal ob du false oder true returnierst, das DragItem verschwindet im Nichts. Also Back zu meiner Ursprünglichen Idee und das ganze nun so aufgebaut.
Qt::DropActions supportedDropActions() const { if (m_maxPlatz == -1 || stringList().size()+1 <= m_maxPlatz) { return Qt::MoveAction; } else { return Qt::IgnoreAction; } }
Und es funktioniert genau so wie ich mir das gewünscht habe. Padreigh, ich danke für deine Engelsgeduld.
Ich wünsche dir eine Gute Nacht !
EDIT: Mist, ich korrigiere meine Aussage. Wenn MaxPlatz erreicht wird funktioniert auch das zurückdraggen nicht mehr *grübel*
EDIT2: Ok, sobald das Draggen beginnt wird das erstmal mal supportedActions aufgerufen, da das Item dabei aber noch auf dem Focus der Liste ist, die Beschränkt ist, kommt als supportedaction "IgnoreAction" und das zurückdraggen funktioniert nicht. Also muss ich eine 3. Stelle finden, wo die Abfrage auf Beschränkung sinn macht.
-
Die Api hilft dir weiter ...
Qt::DropActions QAbstractItemModel::supportedDragActions () const
: Returns the actions supported by the data in this model. The default implementation returns supportedDropActions() unless specific values have been set with setSupportedDragActions().Qt::DropActions QAbstractItemModel::supportedDropActions () const [virtual]: Returns the drop actions supported by this model. The default implementation returns Qt::CopyAction. Reimplement this function if you wish to support additional actions. You must also reimplement the dropMimeData() function to handle the additional operations.
Knobeln ist beim Proggen der halbe Spass, sorry das ich ihn dir klaue
-
Läuft nun rund wie ein Buslenker .... danke sehr .....
Meine erste Idee war ja die dropMimedata umzuschreiben, das wenn size>m_maxplatz das gedragtte item einfach wieder bei der source hinten angefügt wird ... das es natürlich sooo einfach geht ..... sehr gut, nun kann ich das Kapitel endlich komplett abschließen
*verneig*
Der Nala
-
Zumindest kenn ich mich nu mit DnD auch ein wenig besser aus ... pack doch noch ein [solved] an den Thread dran ...
-
Machter sofort.
Eine letzte kleine Frage noch.
m2.setSupportedDragActions(Qt::MoveAction);
Und es läuft wie geschmiert, da ich ja nun aber weiß das ich vergesslich bin, dachte ich mir füge ich in die model.h folgendes ein:
Qt::DropActions supportedDragActions() const { return Qt::MoveAction; }
Das bringt nicht den gewünschten Erfolg - was hab ich schon wieder übersehen ?
-
"virtual" ist hier das Zauberwort
Und die Doku! Da steht auch genau drinnen, was sich wann wie verhält. padreigh hat das vorher auch schon (fast) komplett zitiert.
-
Gut,
http://www.exforsys.com/tutorials/c-plus-plus/c-virtual-functions.html war dazu sehr aussagekräftig ... also nicht vergesslich sein