2012-07-23 17 views
14

Ich bin mit dem QTableView eine QAbstractTableModel anzuzeigen:Wie sortiere ich eine QTableView nach einer Spalte?

#include <QtGui/QApplication> 
#include <QAbstractTableModel> 
#include <QTableView> 

class TestModel : public QAbstractTableModel 
{ 
public: 
    int rowCount(const QModelIndex &parent = QModelIndex()) const 
    { 
     return 2; 
    } 
    int columnCount(const QModelIndex &parent = QModelIndex()) const 
    { 
     return 2; 
    } 
    QVariant data(const QModelIndex &index, int role) const 
    { 
     switch (role) 
     { 
     case Qt::DisplayRole: 
     { 
      return 4 - index.row() + index.column(); 
     } 
     } 
     return QVariant(); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QTableView table; 
    TestModel model; 
    table.setModel(&model); 
    table.setSortingEnabled(true); 
    table.sortByColumn(0, Qt::AscendingOrder); 
    table.reset(); 
    table.show(); 

    return a.exec(); 
} 

The displayed widget

Das Problem ist, dass das Ergebnis ist genau das gleiche, wenn ich benutze:

table.sortByColumn(0, Qt::AscendingOrder); 

oder

table.sortByColumn(0, Qt::DescendingOrder); 

oder

table.sortByColumn(1, Qt::AscendingOrder); 

oder

table.sortByColumn(1, Qt::DescendingOrder); 

Was mache ich falsch?

Antwort

14

QAbstractTableModel bietet eine leere sort() Implementierung.

Versuchen Sie,

TestModel model; 
QSortFilterProxyModel proxyModel; 
proxyModel.setSourceModel(&model); 
table.setModel(&proxyModel); 
+0

Vielen Dank! Es klappt! Aber was habe ich falsch gemacht? Warum funktioniert mein Code nicht? Ich habe die Dokumentation von QTableView und QAbstractTableModel oben und unten gelesen, aber nicht herausgefunden, warum. –

+0

Wenn ich das richtig verstehe, ruft das QTableView nur die leere sort() Funktion des QAbstractTableModels auf? Es macht keine Selbstbestimmung. –

+1

Ja genau. QSqlTableModel verfügt über eine Sortierimplementierungsschnittstelle, sodass die Sortierung dort ohne ein Proxy-Modell funktioniert. Da Sie jedoch ein eigenes Modell verwenden, benötigen Sie ein QSortFilterProxyModel, das - wie der Name schon sagt - auch eine Sortierung implementiert. –

Verwandte Themen