Russian Qt Forum
Ноябрь 27, 2024, 19:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSortFilterProxyModel - множественный фильтр...  (Прочитано 8378 раз)
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"));
}

А чтобы несколько колонок указывать в качестве фильтруемых, я не нашел как....
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Октябрь 21, 2011, 11:59 »

Только самому писать. Вот мой вариант. Там реализованы многоколоночные фильтр и сортировка.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
BaHeK
Гость
« Ответ #2 : Октябрь 21, 2011, 14:07 »

Только самому писать. Вот мой вариант. Там реализованы многоколоночные фильтр и сортировка.

Ну уверен что все понял.... Тоесть выбираются подходящие колонки, и из них создается свой собственный список??
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Октябрь 21, 2011, 14:09 »

Посмотри код. Там даже есть диалоги настройки фильтра и сортировки.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
BaHeK
Гость
« Ответ #4 : Ноябрь 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));//Дата из дилога

Просто и доступно....  Подмигивающий Мот пригодится....
Записан
andrew.k
Гость
« Ответ #5 : Декабрь 04, 2011, 21:41 »

Простой пример понятнее. Пригодился.

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

Мне надо фильтр который будет менять тип фильтрации.
Записан
andrew.k
Гость
« Ответ #6 : Декабрь 05, 2011, 01:21 »

видимо так же как и в обычной модели reset()?
или есть еще варианты?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.148 секунд. Запросов: 23.