QSortFilterProxyModel Multicolumn & Multifilter

Alles rund um die Programmierung mit Qt
Antworten
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

QSortFilterProxyModel Multicolumn & Multifilter

Beitrag von Mani99 »

Hi,

ich bastle gerade an einer ableitung von QSortFilterProxyModel, und möchte erreichen das pro spalte mehrere filter (StringList) gesetzt werden können.

Außerdem möchte ich das, z.b. bei 4 spalten für jede spalte eine Stringlist mit unterschiedlichen filtern gesetzt wird, und nur dann filterAcceptsRow true zurück liefert, wenn bei jeder spalte ein filter aus der jeweiligen liste getroffen hat.

Ich bin mir jetzt nicht so ganz sicher ob das so richtig ist, wie ich das gebaut habe, da es nicht so gefiltert wird, wie ich mir das gedacht habe!

Danke!

mySortFilterProxyModel.h

Code: Alles auswählen

#ifndef MYSORTFILTERPROXYMODEL_H
#define MYSORTFILTERPROXYMODEL_H

#include <QSortFilterProxyModel>
#include <QList>
#include <QStringList>
#include <QPair>

class MySortFilterProxyModel : public QSortFilterProxyModel
{
    typedef QList<QPair<quint32, QStringList> > Filter;
    typedef QPair<quint32, QStringList> FilterEntry;

    public:
        MySortFilterProxyModel(QObject *parent = 0);

        bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
        void setFilter(Filter filter);
        void removeFilter(quint32 column);
        void clearFilter();

    private:
        Filter filter_data;
};

#endif // MYSORTFILTERPROXYMODEL_H
mySortFilterProxyModel.cpp

Code: Alles auswählen

#include "mysortfilterproxymodel.h"

MySortFilterProxyModel::MySortFilterProxyModel(QObject *parent) : QSortFilterProxyModel(parent)
{
}

bool MySortFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
{
    FilterEntry entry;
    foreach(entry, filter_data)
    {
        quint32 column = entry.first;
        QStringList filter_list = entry.second;

        QModelIndex idx = sourceModel()->index(sourceRow, column, sourceParent);
        bool accept_column = false;

        qDebug(qPrintable(sourceModel()->data(idx).toString()));

        QString current_filter;
        foreach(current_filter, filter_list)
        {
            if(sourceModel()->data(idx).toString() == current_filter)
            {
                accept_column = true;
                break;
            }
        }

        if(!accept_column)
            return false;
    }

    return true;
}

void MySortFilterProxyModel::setFilter(Filter filter)
{
    filter_data = filter;
}

void MySortFilterProxyModel::removeFilter(quint32 column)
{
    FilterEntry entry;
    foreach(entry, filter_data)
    {
        if(entry.first == column)
        {
            filter_data.removeOne(entry);
            break;
        }
    }
}

void MySortFilterProxyModel::clearFilter()
{
    filter_data.clear();
}

Antworten