Fragen zu QModelIndex
-
Hallo. Ich habe eine SQLite-Tabelle mit 3 festen Spalten. Die Zeilen können sich ändern.
Mit dem unten stehenden Code werden mir die richtigen Zeilennummern ausgegeben. Allerdings so viel wie Splaten makiert sind. Wenn ich also eine ganze Zeile makiere, wird mir mit qDebug() z.B 0 0 0 ausgeben. Wie kann ich es so ändern, daß nur eine 0 ausgegeben wird, wenn ich eine ganze Zeile makiere?Vielen Dank
void CentralWidget::delMember() { if (db.isOpen()) { QModelIndexList indexList = selectionModel()->selectedIndexes(); int currentRow; foreach (QModelIndex index, indexList) { currentRow = index.row(); //model->removeRows(current, 1); qDebug() << currentRow; } } }
-
Du bekommst für jede Spalte einen ModelIndex, oder?
Dann einfach auf das Foreach verzichten...
-
Aber brauche ich denn die Schleife nicht, falls ich mehre Zeilen löschen möchte?
Es gab einen Fortschritt.
Momentaner Code:
void CentralWidget::delMember() { if (db.isOpen()) { QModelIndexList indexList = selectionModel()->selectedRows(); //Das hier. Irgendwie logisch. QModelIndex index; int currentRow; foreach(index, indexList) { currentRow = index.row(); model->removeRows(currentRow, 1); qDebug() << currentRow; } } }
Per qDebug() werden mir jetzt die richtigen Zeilennummern und auch nur in einfacher ausführung angezeigt. Aber leider funktioniert das Löschen noch nicht ganz. Es wird immer die obere Zeile gelöscht. Also wenn ich Zeile 3 und 5 markiere, gibt qDebug() 3 und 5 aus. Aber gelöscht wird nur Zeile 3. Die Schleife wird doch aber korrekt durchlaufen.
-
Ja, dann schon.
Aber dann solltest du ja auch die 0 0 0 3 mal ausgeben bekommen, oder fehlt dann jeweils nur das newline?
-
Also, wenn ich die erste Zeile löschen will, wird die 0 einmal ausgeben und die Zeile auch gelöscht. Wenn ich allerding die erste und zweite Zeile löschen möchte, wird 0 und 1 ausgeben, was ja richtig ist. Aber nur Zeile 0 wird gelöscht.
Wie meinst du das mit newline?
-
Wenn du 2 hintereinander liegende Zeilen entfernen möchtest, wieso machst du dass dann nicht in einem rutsch? Denn dafür ist doch der 2. Parameter bei removeRows doch da.
Ansonsten ändert sich glaube ich der index (row, column), der nachfolgenden Zeilen, wenn du eine Zeile entfernst. Wenn du jetzt mehrere Zeilen entfernen möchtest, welche nicht nacheinander liegen, dann musst du das entfernen der einzelnen Zeilen "rückwärts" durchführen.
z.b. In einem model mit 5 Zeilgen hat der Benutzer die Zeilen 1,3 und 5 markiert und ruft dann die Methode zum entfernen auf.
Dann müssen die Zeilen in der Reihenfolge 5, 3 1 entfernt werden.
Wenn jetzt die zeile am index (row) "1" zu erste entfernt wird, dann zeigt der index 5 auf kein element im model mehr. Denn nach dem entfernen der 1. Zeile hat das model nur noch 4 elemente (row 1-4).
-
Jau, das wars. Es hat mir auch schon gedämmert, daß dann der Index nicht mehr stimmt. Jetzt läuft es. Vielen Dank.
void CentralWidget::delMember() { if (db.isOpen()) { QModelIndexList indexList = selectionModel()->selectedRows(); QModelIndex index; int currentRow; //foreach(index, indexList) { for (int i = indexList.size() - 1; i >= 0; i--) { index = indexList.at(i); currentRow = index.row(); model->removeRows(currentRow, 1); qDebug() << currentRow; } } }
Gibt es eigentlich eine Möglichkeit die foreach-Schleife Rückwärts zu durchlaufen?