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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: SqlTableModel + SortFilterProxyModel  (Прочитано 9892 раз)
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 не работал прежде , не судите строго... Непонимающий
« Последнее редактирование: Февраль 12, 2013, 13:46 от LEO » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Февраль 12, 2013, 23:39 »

может забыл #include "mysortfilterproxymodel.h" в том файле где твой конструктор?

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
LEO
Гость
« Ответ #2 : Февраль 13, 2013, 11:28 »

Цитировать
#include "mysortfilterproxymodel.h"
на месте... всеравно пишет ту же муйню Непонимающий

дабы не проявлять телепатические способности выкидываю то что получилось
« Последнее редактирование: Февраль 13, 2013, 11:34 от LEO » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Февраль 13, 2013, 12:22 »

перезалей на файлообменник — отсюда не качается
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
LEO
Гость
« Ответ #4 : Февраль 13, 2013, 12:35 »

http://rghost.ru/43762917
« Последнее редактирование: Февраль 13, 2013, 12:47 от LEO » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Февраль 13, 2013, 14:20 »

всё работает. полностью очисти проект и пересобери.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
LEO
Гость
« Ответ #6 : Февраль 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()));
« Последнее редактирование: Февраль 13, 2013, 16:06 от LEO » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Февраль 13, 2013, 18:36 »

думаю индексы должны быть 0 и 1 а не 1 и 2
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
LEO
Гость
« Ответ #8 : Февраль 13, 2013, 22:18 »

пробовал менять, 0 реакции
Записан
schmidt
Гость
« Ответ #9 : Февраль 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

Ищите ошибку в другом месте Улыбающийся
Записан
LEO
Гость
« Ответ #10 : Февраль 14, 2013, 07:53 »

qDebug() << model->rowCount() << " rows loaded in model";

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

Сообщений: 4747



Просмотр профиля WWW
« Ответ #11 : Февраль 14, 2013, 12:28 »

код фильтрации 100% правильный. поставь в том методе брейкпоинт и посмотри попадает ли вообще.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
LEO
Гость
« Ответ #12 : Февраль 14, 2013, 15:15 »

в режиме отладки вообще не собирается, выдает ошибку,
ASSERT failure in QVector<T>::at: "index out of range", file ..\..\include/QtCore/../../src/corelib/tools/qvector.h, line 351 Шокированный
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #13 : Февраль 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("......") предназначено для перевода с английского на другие языки, а не наоборот.
« Последнее редактирование: Февраль 14, 2013, 17:22 от ViTech » Записан

Пока сам не сделаешь...
LEO
Гость
« Ответ #14 : Февраль 15, 2013, 00:01 »

возможно неправ с этими переводами, но на английском оставить, не так меня поймут), так вроде отображает как надо, на фильтрацию это врядли влияет, а так спасибо за замечание, как говорится на ошибках учатся, к сожалению в основном приходится учится исключительно на своих... Грустный
в общем сделал так:

proxy->setFilterKeyColumn(-1);\\ начало искать по всем колонкам, в принципе терпимо
вроде как начало работать, всем спасибо
« Последнее редактирование: Февраль 15, 2013, 11:25 от LEO » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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