2012-07-23 41 views
14

estoy usando el QTableView para mostrar un QAbstractTableModel:¿Cómo ordenar un QTableView por una columna?

#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

El problema es que el resultado es exactamente el mismo cuando uso:

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

o

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

o

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

o

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

¿Qué estoy haciendo mal?

Respuesta

14

QAbstractTableModel proporciona una implementación sort() vacía.

trate de hacer

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

Gracias! ¡Funciona! Pero, ¿qué estaba haciendo mal? ¿Por qué mi código no funciona? He leído la documentación de QTableView y QAbstractTableModel arriba y abajo, pero no he averiguado por qué. –

+0

Si entiendo esto correctamente, ¿QTableView simplemente llama a la función de clasificación vacía de QAbstractTableModel? No hace ningún movimiento por sí mismo? –

+1

Sí exactamente. QSqlTableModel tiene una iirc de implementación de clasificación, por lo que la ordenación funciona allí sin un modelo de proxy. Sin embargo, como está utilizando un modelo propio, necesita un QSortFilterProxyModel que, como su nombre lo indica, también tiene una implementación de clasificación. –

Cuestiones relacionadas