2012-07-23 163 views
14

我使用QTableView顯示QAbstractTableModel:如何按列排序QTableView?

#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

的問題是,結果是完全一樣的,當我使用:

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

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

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

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

我在做什麼錯?

回答

14

QAbstractTableModel提供了一個空的sort()實現。

嘗試做

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

謝謝!有用!但是我做錯了什麼?爲什麼我的代碼無法工作?我已經閱讀了QTableView和QAbstractTableModel的文檔,但沒有找到原因。 – 2012-07-23 06:32:12

+0

如果我正確理解這一點,QTableView只是調用QAbstractTableModel的空sort()函數?它本身沒有進行任何投票? – 2012-07-23 06:49:12

+1

是的。 QSqlTableModel確實有一個排序實現iirc,所以排序工作沒有代理模式。但是,由於您使用的是自己的模式,你需要一個QSortFilterProxyModel其中 - 顧名思義 - 確實有一個排序的實現也是如此。 – 2012-07-23 08:59:05