2012-07-23 2 views
14

Sto usando il QTableView per visualizzare un QAbstractTableModel:Come ordinare un QTableView per colonna?

#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

Il problema è che il risultato è esattamente lo stesso quando uso:

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

o

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

o

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

o

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

Che cosa sto facendo di sbagliato?

risposta

14

QAbstractTableModel fornisce un'implementazione sort() vuota.

provare a fare

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

Grazie! Funziona! Ma cosa stavo facendo male? Perché il mio codice non funziona? Ho letto la documentazione di QTableView e QAbstractTableModel su e giù, ma non ho scoperto il motivo. –

+0

Se ho capito bene, QTableView chiama semplicemente la funzione di ordinamento vuoto() di QAbstractTableModel? Non fa soting da solo? –

+1

Sì esattamente. QSqlTableModel ha un'implementazione di tipo iirc, quindi l'ordinamento funziona senza un modello proxy. Tuttavia, poiché si utilizza un proprio modello, è necessario un QSortFilterProxyModel che, come suggerisce il nome, ha anche un'implementazione di ordinamento. –