2012-07-23 16 views
14

私はQAbstractTableModelを表示するQTableViewを使用しています: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の両方のドキュメントを読んだことがありますが、その理由は分かりませんでした。 –

+0

これを正しく理解すると、QTableViewはQAbstractTableModelの空のsort()関数を呼び出します。それ自体は何も出されませんか? –

+1

はい。 QSqlTableModelはソート実装iircを持っているため、ソートはプロキシモデルなしで動作します。しかし、独自のモデルを使用している場合は、QSortFilterProxyModelが必要です。これは、名前が示すように、ソート実装も備えています。 –

関連する問題