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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSortfilterproxymodel поиск по нескольким полям  (Прочитано 3545 раз)
sektor
Самовар
**
Offline Offline

Сообщений: 100


Просмотр профиля
« : Август 31, 2016, 11:13 »

Есть таблица TableView c несколькими колонками. Я хотел бы осуществить поиск по всем или выбранным колонкам таблицы с помощью QSortfilterproxymodel. Как я знаю данный класс позволяет производить поиск только по одной колонке. Я нашел решение в интернете, но что то оно тоже не хочет компилироваться. Может у кого есть свои варианты решения данной проблемы?
Код:
/********************************************************************
* Copyright (C) PanteR
*-------------------------------------------------------------------
*
* QDBFRedactor is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* QDBFRedactor is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Panther Commander; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*-------------------------------------------------------------------
* Project: QDBFRedactor
* Author: PanteR
* Contact: panter.dsd@gmail.com
*******************************************************************/

#ifndef DBFREDACTORSORTFILTERPROXYMODEL_H
#define DBFREDACTORSORTFILTERPROXYMODEL_H

#include <QtGui/QSortFilterProxyModel>

class DBFRedactorSortFilterProxyModel : public QSortFilterProxyModel
{
Q_OBJECT

public:

enum FilterOperator {
AND,
OR
};

enum FilterUslovie {
Equal = 0,
NotEqual,
Smaller,
SmallerOrEqual,
Lager,
LagerOrEqual
};

struct FilterItem {
FilterOperator filterOperator;
int column;
FilterUslovie uslovie;
QRegExp regExp;
};

private:
QList<QPair<int, Qt::SortOrder> > m_sortedColumns;
Qt::SortOrder m_sortOrder;
QList<FilterItem> m_filter;

public:
DBFRedactorSortFilterProxyModel(QObject *parent = 0);
virtual ~DBFRedactorSortFilterProxyModel()
{}

QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const;

QList<QPair<int, Qt::SortOrder> > sortedColumns() const
{return m_sortedColumns;}
void setSortedColumns(QList<QPair<int, Qt::SortOrder> > sortedColumns)
{
m_sortedColumns = sortedColumns;
sort();
}

void addSortedColumn(int column, Qt::SortOrder order);
void removeSortedColumn(int column);
void changeSortedColumn(int column, Qt::SortOrder order);

Qt::SortOrder sortOrder() const
{return m_sortOrder;}
Qt::SortOrder sortOrder(int column) const;

bool isColumnInSort(int column) const;

QList<FilterItem> filter() const
{return m_filter;}
void addFilter(const FilterItem& filterItem)
{
m_filter.append(filterItem);
invalidate();
}
void setFilter(QList<FilterItem> filter)
{
m_filter = filter;
invalidate();
}

protected:
void sort();
bool lessThan ( const QModelIndex & left, const QModelIndex & right ) const;
bool filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const;

private:
inline int naturalCompare(const QString& left, const QString& right, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;

public Q_SLOTS:
void clearSort();
void removeFilter()
{
m_filter.clear();
invalidate();
}
};

#endif //DBFREDACTORSORTFILTERPROXYMODEL_H
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Август 31, 2016, 13:35 »

Эмм, и какие ошибки были при компиляции?
Тот кусок кода, что вы дали -- заголовочник и для него не хватает исходника (cpp).
А вот сам проект: https://github.com/panter-dsd/QDBFRedactor
Нужный вам класс находится в этой папке: https://github.com/panter-dsd/QDBFRedactor/tree/master/src/core
« Последнее редактирование: Август 31, 2016, 13:39 от gil9red » Записан

sektor
Самовар
**
Offline Offline

Сообщений: 100


Просмотр профиля
« Ответ #2 : Август 31, 2016, 14:23 »

Да.. уж не заметил реализацию. Спасибо. Скачал все компилиться. Но как его настроить? пример тоже не понятный. И вообще есть ли белее простые решения? Мне сортировка не нужно, просто поиск по регулярному выражению по всем столбцам таблицы. 
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #3 : Август 31, 2016, 15:32 »

Лучше поразбирайтесь в том коде и посмотрите как и где используется это прокси модель Улыбающийся
Записан

sektor
Самовар
**
Offline Offline

Сообщений: 100


Просмотр профиля
« Ответ #4 : Август 31, 2016, 16:01 »

Эхх ладно .... Показает язык
Записан
sektor
Самовар
**
Offline Offline

Сообщений: 100


Просмотр профиля
« Ответ #5 : Сентябрь 01, 2016, 10:07 »

Надо было  вот что делать setFilterKeyColumn(-1);
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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