Russian Qt Forum

Qt => Вопросы новичков => Тема начата: sektor от Август 31, 2016, 11:13



Название: QSortfilterproxymodel поиск по нескольким полям
Отправлено: sektor от Август 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


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


Название: Re: QSortfilterproxymodel поиск по нескольким полям
Отправлено: sektor от Август 31, 2016, 14:23
Да.. уж не заметил реализацию. Спасибо. Скачал все компилиться. Но как его настроить? пример тоже не понятный. И вообще есть ли белее простые решения? Мне сортировка не нужно, просто поиск по регулярному выражению по всем столбцам таблицы. 


Название: Re: QSortfilterproxymodel поиск по нескольким полям
Отправлено: gil9red от Август 31, 2016, 15:32
Лучше поразбирайтесь в том коде и посмотрите как и где используется это прокси модель :)


Название: Re: QSortfilterproxymodel поиск по нескольким полям
Отправлено: sektor от Август 31, 2016, 16:01
Эхх ладно .... :P


Название: Re: QSortfilterproxymodel поиск по нескольким полям
Отправлено: sektor от Сентябрь 01, 2016, 10:07
Надо было  вот что делать setFilterKeyColumn(-1);