Russian Qt Forum

Qt => Model-View (MV) => Тема начата: LEO от Февраль 12, 2013, 13:43



Название: SqlTableModel + SortFilterProxyModel
Отправлено: LEO от Февраль 12, 2013, 13:43
Добрый день, пытаюсь сделать фильтр, так чтобы он работал сразу на две колонки при вводе в одно поле эдита. Использую QSqlTablemodel + QSortFilterModel + tableview, для данной цели создал класс (отнаследовался от QSortFilterProxyModel), следующим образом:
.h
Код:
class MyFilterProxyModel : public QSortFilterProxyModel
{
    Q_OBJECT
public:
    MyFilterProxyModel(QObject *parent = 0);
protected:
    bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;

};
.cpp
Код:
#include <QtGui>
#include "mysortfilterproxymodel.h"

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

bool MyFilterProxyModel::filterAcceptsRow(int sourceRow,
        const QModelIndex &sourceParent) const
{
    QModelIndex index1 = sourceModel()->index(sourceRow, 1, sourceParent);
    return (sourceModel()->data(index1).toString().contains(filterRegExp()));
}

вот кусок кода из конструктора
Код:
\\\\\\\\\\\\\\\\\\\\\
    model = new QSqlTableModel(this);
    proxy = new MyFilterProxyModel(this);
    proxy->setDynamicSortFilter(true);
    proxy->setSourceModel(model);
    ui->tableView->setModel(proxy);

при этом возникает ошибка: "ошибка: undefined reference to `vtable for MyFilterProxyModel'"
при этом если использовать QSortFilterProxyModel напрямую, то фильтрация работает по одной колонке...
в чем может быть, проблема, с QSortFilterProxyModel не работал прежде , не судите строго... ???


Название: Re: SqlTableModel + SortFilterProxyModel
Отправлено: kambala от Февраль 12, 2013, 23:39
может забыл #include "mysortfilterproxymodel.h" в том файле где твой конструктор?

и твой код будет фильтровать лишь по второй колонке, а не по первым двум. для первой надо аналогичное условие через || дописать.


Название: Re: SqlTableModel + SortFilterProxyModel
Отправлено: LEO от Февраль 13, 2013, 11:28
Цитировать
#include "mysortfilterproxymodel.h"
на месте... всеравно пишет ту же муйню ???

дабы не проявлять телепатические способности выкидываю то что получилось


Название: Re: SqlTableModel + SortFilterProxyModel
Отправлено: kambala от Февраль 13, 2013, 12:22
перезалей на файлообменник — отсюда не качается


Название: Re: SqlTableModel + SortFilterProxyModel
Отправлено: LEO от Февраль 13, 2013, 12:35
http://rghost.ru/43762917


Название: Re: SqlTableModel + SortFilterProxyModel
Отправлено: kambala от Февраль 13, 2013, 14:20
всё работает. полностью очисти проект и пересобери.


Название: Re: SqlTableModel + SortFilterProxyModel
Отправлено: LEO от Февраль 13, 2013, 15:21
действительно поудалял генерируемые файлы и собралось все без ошибок, однако  фильтрует исключительно по одному столбцу... :(
фильтруется только одна колонка где фио так как прописано  proxy->setFilterKeyColumn(1); если это убрать то фильтруется только по колонке Id она нулевая, хотя условие подправил чтоб 2 фильтровал как вы и говорили ранее

Код:
 
QModelIndex index0 = sourceModel()->index(sourceRow, 1, sourceParent);
QModelIndex index1 = sourceModel()->index(sourceRow, 2, sourceParent);

return (sourceModel()->data(index0).toString().contains(filterRegExp())
            || sourceModel()->data(index1).toString().contains(filterRegExp()));


Название: Re: SqlTableModel + SortFilterProxyModel
Отправлено: kambala от Февраль 13, 2013, 18:36
думаю индексы должны быть 0 и 1 а не 1 и 2


Название: Re: SqlTableModel + SortFilterProxyModel
Отправлено: LEO от Февраль 13, 2013, 22:18
пробовал менять, 0 реакции


Название: Re: SqlTableModel + SortFilterProxyModel
Отправлено: schmidt от Февраль 14, 2013, 06:37
А вы вообще пробовали для верности написать

Код:
bool MyFilterProxyModel::filterAcceptsRow(int sourceRow,
                                          const QModelIndex sourceParent) const {
    return true;
}
?

Ибо в вашей модели просто не загружено никаких данных.

Код:
   
qDebug() << model->rowCount() << " rows loaded in model";

Пишет
Код:
0 rows loaded in model

Ищите ошибку в другом месте :)


Название: Re: SqlTableModel + SortFilterProxyModel
Отправлено: LEO от Февраль 14, 2013, 07:53
qDebug() << model->rowCount() << " rows loaded in model";

сделал как вы говорили, пишет что 4 строки загружено, т.к. в модели и есть 4, видимо у вас 0 писало так как база которая там залита пустая,и вы не добавляли строк...


Название: Re: SqlTableModel + SortFilterProxyModel
Отправлено: kambala от Февраль 14, 2013, 12:28
код фильтрации 100% правильный. поставь в том методе брейкпоинт и посмотри попадает ли вообще.


Название: Re: SqlTableModel + SortFilterProxyModel
Отправлено: LEO от Февраль 14, 2013, 15:15
в режиме отладки вообще не собирается, выдает ошибку,
ASSERT failure in QVector<T>::at: "index out of range", file ..\..\include/QtCore/../../src/corelib/tools/qvector.h, line 351 :o


Название: Re: SqlTableModel + SortFilterProxyModel
Отправлено: ViTech от Февраль 14, 2013, 17:20
Может сначала надо model->select() вызвать, а потом model->setHeaderData? Так и в справке написано.

Код
C++ (Qt)
model->select();
model->setHeaderData(fio, Qt::Horizontal, tr("Ф.И.О."));
model->setHeaderData(otdel, Qt::Horizontal, tr("Отдел"));
model->setHeaderData(tel, Qt::Horizontal, tr("Телефон"));

И строки надо всегда писать латинскими буквами. Не надо туда пихать русские, тем более не в кодировке UTF-8. tr("......") предназначено для перевода с английского на другие языки, а не наоборот.


Название: Re: SqlTableModel + SortFilterProxyModel
Отправлено: LEO от Февраль 15, 2013, 00:01
возможно неправ с этими переводами, но на английском оставить, не так меня поймут), так вроде отображает как надо, на фильтрацию это врядли влияет, а так спасибо за замечание, как говорится на ошибках учатся, к сожалению в основном приходится учится исключительно на своих... :(
в общем сделал так:

proxy->setFilterKeyColumn(-1);\\ начало искать по всем колонкам, в принципе терпимо
вроде как начало работать, всем спасибо


Название: Re: SqlTableModel + SortFilterProxyModel
Отправлено: ViTech от Февраль 15, 2013, 11:47
возможно неправ с этими переводами, но на английском оставить, не так меня поймут), так вроде отображает как надо, на фильтрацию это врядли влияет, а так спасибо за замечание, как говорится на ошибках учатся, к сожалению в основном приходится учится исключительно на своих... :(
С переводом лучше пораньше разобраться, тем более, что там все довольно просто. А так, чем дальше - тем больше потом переделывать придется :).


Название: Re: SqlTableModel + SortFilterProxyModel
Отправлено: LEO от Февраль 15, 2013, 14:23
я на самом деле не вижу там глобальной проблемы все отображается как надо, на что это влияет?!


Название: Re: SqlTableModel + SortFilterProxyModel
Отправлено: ViTech от Февраль 15, 2013, 14:58
Когда не видят глобальных проблем, то получают много локальных :). На что это повлияет узнаете, когда встретятся два файла в кодировке UTF-8 и CP-1251. Или когда у человека редактор будет настроен на UTF-8 и он откроет ваши исходники. И наоборот. Не говоря уже о том, все ли компиляторы захотят такое кушать.