2016-03-24 5 views
0

Ich habe QT-Dokument als Referenz gesucht, aber ich habe ein paar Fragen. Hier ist die Implementierung in QT doc:Wie implementiert man die removeRow() - Funktion für ein benutzerdefiniertes Modell in QT?

bool TableModel::removeRows(int position, int rows, const QModelIndex &index) 
{ 
    Q_UNUSED(index); 
    beginRemoveRows(QModelIndex(), position, position + rows - 1); 

    for (int row = 0; row < rows; ++row) { 
     listOfPairs.removeAt(position); 
    } 

    endRemoveRows(); 
    return true; 
} 

Ich denke, es nutzt im Tableview index.row direkt die Daten im Modell zu finden. Was aber, wenn ich die Sortierung für die Tabellenansicht aktiviere? Nach dem Sortieren entspricht der Index in der Tabellenansicht nicht den Daten im Modell. Die erste Zeile in der Tabellenansicht kann die dritte Daten im Modell sein.

Wie kann ich die Daten im Modell über Tabellenansicht lokalisieren? Und gibt es bessere Implementierungen für die Funktion removeRow()?

Antwort

0

Als offizielle Dokumentation says,

Es gibt zwei Möglichkeiten der Annäherung in dem Model/View-Architektur Sortierung: Wenn Ihr Modell sortierbar ist, das heißt, wenn es die QAbstractItemModel reimplementiert :: sort() -Funktion bieten sowohl QTableView als auch QTreeView eine API, mit der Sie Ihre Modelldaten programmgesteuert sortieren können. Wenn Ihr Modell nicht über die erforderliche Schnittstelle verfügt oder wenn Sie eine Listenansicht zum Präsentieren Ihrer Daten verwenden möchten, verwenden Sie ein Proxy-Modell, um die Struktur Ihres Modells zu transformieren, bevor Sie die Daten in der Ansicht

darstellen

Was passiert, wenn Sie die Sortierung ändern, hängt davon ab, wie Sie die Sortierung für Ihr Modell anordnen: Die Sortierung in der Ansicht ändert die Anordnung der Zeilen im Modell oder ändert nur diese Anordnung für das Proxy-Modell.

Wenn Sie das Proxy-Modell verwenden, können Sie dort eine Zuordnung zwischen den Zeilen des Proxy-Modells (wie die Ansicht sie mit der aktuellen Sortierung sieht) und den Zeilen des ursprünglichen Modells einfügen. Oder Sie fügen einfach eine Zuordnung zwischen der Zeile und dem tatsächlichen Datenelement für diese Zeile im ursprünglichen Modell hinzu - Sie können sogar ein void* direkt in das Datenelement QModelIndex in der Neuimplementierung Ihres Modells von QAbstractItemModel::createIndex einbetten und dann den Zeiger abrufen Das Element aus dem Index wurde an Methoden wie removeRow übergeben. Eine andere Möglichkeit ist operate mit einer eindeutigen Integer-Kennung des Elements anstelle des direkten Zeigers darauf. Es hängt also von Ihnen ab, wie die Zuordnung zwischen den Zeilen und den tatsächlichen Modellelementen erfolgt.