2014-06-12 56 views
0

這裏是我的程序:QTreeView則QSortFilterProxyModel觸發濾波器

#include <QStandardItemModel> 
#include <QSortFilterProxyModel> 
#include <QTreeView> 


class MySortFilterProxyModel : public QSortFilterProxyModel 
{ 
public: 
    MySortFilterProxyModel(); 
    void updateFilter(int filterType); 
protected: 
    bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; 
    bool lessThan(const QModelIndex &left,const QModelIndex &right) const; 
private: 
    int _filterType; 
}; 

MySortFilterProxyModel::MySortFilterProxyModel() 
    : _filterType(0) 
{ 
} 

bool MySortFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const 
{ 

    QStandardItemModel* source = static_cast<QStandardItemModel*>(sourceModel()); 
    QModelIndex modelIndex = source->index(sourceRow, 0, sourceParent); 
    QStandardItem* item = source->itemFromIndex(modelIndex); 

    QVariant v = item->data(Qt::UserRole); 

    int itemType = v.toInt(); 

    if(itemType == _filterType) 
     return true; 

    return false; 
} 

bool MySortFilterProxyModel::lessThan(const QModelIndex &left,const QModelIndex &right) const 
{ 
    QVariant leftData = sourceModel()->data(left); 
    QVariant rightData = sourceModel()->data(right); 

    if(leftData.type() == QVariant::String && rightData.type() == QVariant::String) 
    { 
     QString leftString = leftData.toString(); 
     QString rightString = rightData.toString(); 

     return QString::localeAwareCompare(leftString, rightString) < 0; 
    } 

    return false; 
} 

void MySortFilterProxyModel::updateFilter(int filterType) 
{ 
    _filterType = filterType; 
    // how can i trigger filteracceptRows here ?? 
} 

int main(int argc, char** argv) 
{ 
    QApplication qtApp(argc, argv); 

    MySortFilterProxyModel mySortFilterProxyModel; 
    QStandardItemModel standardModel; 
    QTreeView treeView; 

    mySortFilterProxyModel.setSourceModel(&standardModel); 
    treeView.setModel(&standardModel); 
    treeView.setSortingEnabled(true); 

    treeView.show(); 

    return qtApp.exec(); 
} 

每次我AppendRow到standardModel排序和篩選工作。 我如何觸發過濾而不添加或刪除標準模型的東西? 我想通過右鍵點擊QTreeView上的行,但我找不到方法來觸發我的void MySortFilterProxyModel :: updateFilter(int filterType)函數上的filterAcceptRows。 對於每個可能的filterType值有多個MySortFilterProxyModel類的實例,並根據filterType切換它們可能會起作用,但有沒有更好的解決方案?

+0

不是'QTreeView :: sortByColumn()'調用列上的排序嗎? – vahancho

+0

是的,但我的問題是觸發filterAcceptRows。就我所見,沒有像QTreeView :: filter()這樣的函數。 – otto

+1

您是否嘗試調用'invalidate()'槽? –

回答

0

在updateFilter上調用invalidate()爲我工作。

void MySortFilterProxyModel::updateFilter(int filterType) 
{ 
    _filterType = filterType; 
    invalidate(); 
}