QTreeView QSortFilterProxyModel触发器过滤器

时间:2014-06-12 07:55:29

标签: c++ qt

这是我的计划:

#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();
}

Everytime i AppendRow to standardModel sort and filter works。 如何在不添加或删除标准模型的情况下触发过滤? 我想通过右键单击来过滤QTreeView上的行,但我找不到在我的void MySortFilterProxyModel :: updateFilter(int filterType)函数上触发filterAcceptRows的方法。 为每个可能的filterType值设置多个MySortFilterProxyModel类实例并根据filterType进行切换可能有效,但是有更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

在updateFilter上调用invalidate()对我有用。

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