#include <QtGui/QSortFilterProxyModel>class SortFilterProxyModel : public QSortFilterProxyModel{ Q_OBJECTpublic: SortFilterProxyModel(QObject* parent = 0) : QSortFilterProxyModel(parent) {} virtual ~SortFilterProxyModel() {} // в данном упрощённом примере ловлю хидерДату чтобы вовремя скрывать "нежелательные" столбцы void SortFilterProxyModel::setSourceModel(QAbstractItemModel* sourceModel) { disconnect(QSortFilterProxyModel::sourceModel(), SIGNAL(headerDataChanged(Qt::Orientation, int, int)), this, SLOT(invalidate())); QSortFilterProxyModel::setSourceModel(sourceModel); connect(QSortFilterProxyModel::sourceModel(), SIGNAL(headerDataChanged(Qt::Orientation, int, int)), this, SLOT(invalidate())); }protected: virtual bool filterAcceptsColumn(int source_column, const QModelIndex& source_parent) const { return (source_column % 2 != 0); }};
MySubclassedAbstractTableModel* m_model = new MySubclassedAbstractTableModel(this);SortFilterProxyModel* m_proxyModel = new SortFilterProxyModel(this);m_proxyModel->setSourceModel(m_model);QTableView* m_tableView = new QTableView(this);tableView->setModel(m_proxyModel);tableView->setSortingEnabled(true);
SortFilterProxyModel::sort(int column, Qt::SortOrder order){ QSortFilterProxyModel::sort(filterColumnToSourceColumn(column), order);}
int SortFilterProxyModel::filterColumnToSourceColumn(filterColumn){ if(filterColumn < 0) return filterColumn; for(int n=-1, nSourceColumn=-1; n<filterColumn;) { if(___valid___(++nSourceColumn)) n++; } return sourceColumn;}