Russian Qt Forum

Qt => Базы данных => Тема начата: BaHeK от Октябрь 21, 2011, 11:48



Название: QSortFilterProxyModel - множественный фильтр...
Отправлено: BaHeK от Октябрь 21, 2011, 11:48
Здравствуйте! Появился у меня вопрос... В справочнике я скрываю удаленные строки:
Код:
m_pFilterModel->setFilterKeyColumn(m_pTableModel->fieldIndex("b_deleted"));
m_pFilterModel->setFilterRegExp(QRegExp("false"));

И вот сделал я поиск в справочнике по МФО... и как мне сделать чтобы фильтра было 2... и по МФО и по колонке "b_deleted"... Просто я делаю дальше так:

Код:
void BanksList::slotSearch(bool bFilter)
{
    if(bFilter){
        searchDialog();
    }
    else{
        m_pFilterModel->setFilterRegExp(QRegExp("false"));
        m_pFilterModel->setFilterKeyColumn(m_pTableModel->fieldIndex("b_deleted"));
    }
}

void BanksList::slotSetFilter(QString *sText)
{
    m_pFilterModel->setFilterRegExp(QRegExp(sText[0]));
    m_pFilterModel->setFilterKeyColumn(m_pTableModel->fieldIndex("s_mfo"));
}

А чтобы несколько колонок указывать в качестве фильтруемых, я не нашел как....


Название: Re: QSortFilterProxyModel - множественный фильтр...
Отправлено: Пантер от Октябрь 21, 2011, 11:59
Только самому писать. Вот мой вариант (https://github.com/panter-dsd/QDBFRedactor/blob/master/src/core/dbfredactorsortfilterproxymodel.h). Там реализованы многоколоночные фильтр и сортировка.


Название: Re: QSortFilterProxyModel - множественный фильтр...
Отправлено: BaHeK от Октябрь 21, 2011, 14:07
Только самому писать. Вот мой вариант (https://github.com/panter-dsd/QDBFRedactor/blob/master/src/core/dbfredactorsortfilterproxymodel.h). Там реализованы многоколоночные фильтр и сортировка.

Ну уверен что все понял.... Тоесть выбираются подходящие колонки, и из них создается свой собственный список??


Название: Re: QSortFilterProxyModel - множественный фильтр...
Отправлено: Пантер от Октябрь 21, 2011, 14:09
Посмотри код. Там даже есть диалоги настройки фильтра и сортировки.


Название: Re: QSortFilterProxyModel - множественный фильтр...
Отправлено: BaHeK от Ноябрь 01, 2011, 09:16
Несколько другой пример собственного фильтра... Просто и наглядно... Выбираются строки, где дата находится в нужном диапазоне.... Разобрался что как работает и вот решил свой пример выложить... Может кому и понадобится.... Сделал так:

Код:
#ifndef MYDATEFILTERPROXYMODEL_H
#define MYDATEFILTERPROXYMODEL_H

#include<QDate>
#include<QSortFilterProxyModel>

class MyDateFilterProxyModel: public QSortFilterProxyModel
{
    Q_OBJECT
public:
    MyDateFilterProxyModel(QObject *parent = 0);

private:
    int m_nFilterIndex;
    QDate m_dtMinDate;
    QDate m_dtMaxDate;

protected:
    bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;

public:
    void setFilterIndex(int nIndex)
    {
        m_nFilterIndex = nIndex;
    }

    void setMinDate(QDate date)
    {
        m_dtMinDate = date;
    }

    void setMaxDate(QDate date)
    {
        m_dtMaxDate = date;
    }
};

#endif // MYDATEFILTERPROXYMODEL_H

И, собсна, сама реализация...
Код:
#include "mydatefilterproxymodel.h"

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

bool MyDateFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
    QModelIndex idx = sourceModel()->index(source_row, m_nFilterIndex, source_parent);

    return (sourceModel()->data(idx).toDate() >= m_dtMinDate)
                && (sourceModel()->data(idx).toDate() <= m_dtMaxDate);
}

Далее создастся диалог ввода дат фильтра... и будет обрабатываться так:

Код:
    m_pDateFilterModel = new MyDateFilterProxyModel(this);
    m_pDateFilterModel->setSourceModel(m_pTableModel);

    m_pDateFilterModel->setFilterIndex(m_pTableModel->fieldIndex("dt_date"));
    m_pDateFilterModel->setMinDate(QDate(2011, 10, 01));//Дата из дилога
    m_pDateFilterModel->setMaxDate(QDate(2011, 10, 31));//Дата из дилога

Просто и доступно....  ;) Мот пригодится....


Название: Re: QSortFilterProxyModel - множественный фильтр...
Отправлено: andrew.k от Декабрь 04, 2011, 21:41
Простой пример понятнее. Пригодился.

Остается вопрос. Как уведомить вьюху, что фильтр изменился?

Мне надо фильтр который будет менять тип фильтрации.


Название: Re: QSortFilterProxyModel - множественный фильтр...
Отправлено: andrew.k от Декабрь 05, 2011, 01:21
видимо так же как и в обычной модели reset()?
или есть еще варианты?