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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: фильтрация по иконкам  (Прочитано 7812 раз)
Majestio
Гость
« Ответ #15 : Август 20, 2013, 11:22 »

helga1917, попробуйте переосмыслить ваш подход к реализации.

Я напомню:
  • представление - позволяет отображать данные
  • модель - позволяет отдавать данные, и не обязательно их хранить в себе, это может быть и другой источник, в зависимости от типа используемой модели
  • делегат - позволяет изменить отображение данных

Таким образом, от модели вам нужно только одно, отдавать числовые и строковые данные. Прорисовкой иконок пусть занимается делегат. Увидит тип сообщения int 1 - одна иконка, int 2 - другая

Остается задача фильтрации по данным (например, по типу сообщения).
Попробуйте bool QSortFilterProxyModel::filterAcceptsRow

... ну а иконки пусть рисует делегат.

И вдогоночку, а если работаете с БД, почему бы фильтрацию не возложить на БД?
« Последнее редактирование: Август 20, 2013, 11:25 от Majestio » Записан
mutineer
Гость
« Ответ #16 : Август 20, 2013, 11:26 »

Ну технически сейчас иконки тоже делегат рисует. Дефолтный
Записан
Majestio
Гость
« Ответ #17 : Август 20, 2013, 11:41 »

Ну технически сейчас иконки тоже делегат рисует. Дефолтный

А откуда он их берет, из модели? Если "да", это же кощунственно?!
Записан
mutineer
Гость
« Ответ #18 : Август 20, 2013, 11:43 »

Зависит от задачи. Иконка может быть не декорацией, а именно самими данными. В этом случае нахождение иконки в модели вполне оправдано
Записан
helga1917
Гость
« Ответ #19 : Август 20, 2013, 11:49 »

тут могут быть опечатки, т.к. набираю вручную, копировать возможности нет
main:
Код:
#include <QtGui>
#include "typeFilter.h"
void addMail(QAbstractItemModel *model, const QString id, const QPixmap Pix,
                  const QDateTime &date, const QString &info)
{model->setData(model->index(0,0),id, 3);              //идентификатор, 3 роль ToolTipRole(если прописать тут 0,
                                                                        // то фильтрует, но тогда id отображается на форме)
model->setData(model->index(0,0),Pix,1);            //иконка
model->setData(model->index(0,1),date);            //время
model->setData(model->index(0,2),info);             //текст сообщения
}
QAbstractItemModel *createMailModel (QObject *parent)
{QStandardItemModel *model2 = new StandardItemModel (0,3, parent);

QPixmap *pixCrash = new QPixmap ("crash.png");
QPixmap *pixAtt = new QPixmap ("att.png");

addMail (model2, "1", *pixCrash, QDateTime(QDate(2013,12,23),QTime(17,03)), QObject::tr("Сообщение"));
addMail (model2, "2", *pixAtt, QDateTime(QDate(2013,12,23),QTime(17,03)), QObject::tr("Сообщение"));
return model2;
}
int main (int argc, char *argv[])
{
QApplication app(argc,argv);
Window window;
window.setSourceModel (createMailModel (&window));
window.show();
return app.exec();
}

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

MySortFilterProxyModel::MySortFilterProxyModel (QObject *parent)
                                 :QSortFilterProxyModel (parent)
{
}
bool MySortFilterProxyModel::filterAcceptRow (int sourceRow, const QModelIndex &sourceParent) const
{
QModelIndex index0=soutceModel()->index(sourceRow, 0, sourceParent);
return (sourceModel()->data(index0).toString.contains(filterRegExp()));
}
typeFilter.cpp:
Код:
#include <QtGui>
#include "mysortfilterproxymodel.h"
#include "typeFilter.h"
Window::Window()
{
proxyModel = new MySortFilterProxyModel(this);
proxyModel->setFilterKeyColumn(0);

readButton = new QPushButton;

 proxyView = new QTreeView;
proxyView->setRootIsDecorated(false);
proxyView->setModel(proxyModel);
proxyView->setSortingEnabled(true);
proxyView->sortByColumn(0, Qt::AscendingOrder);
proxyView->setSelectionBehavior(QAbstractItenView::SelectRows);

connect (readButton, SIGNAL(clicked()), this, SLOT (iconFilter()));

QHBoxLayout *proxyLayout = new QHBoxLayout;
proxyLayout ->addWidget(readButton);
proxyLayout ->addWidget(proxyView);

setLayout(proxyLayout);
}

void Window::setSourceModel (QAbstractItemModel *model)
{
proxyModel->setSourceModel(model);
}

void Window::iconFilter()
{
proxyModel->setFilterRole(3);
proxyModel->setFilterRegExp(QRegExp("1"));
}
mysortfilterproxymodel.h:
Код:
#ifndef RTY
#define RTY
#include <QSortFilterProxyModel>
#include <QDate>

class MySortFilterProxyModel : public QSortFilterProxyModel
{
Q_OBJECT
public:
 MySortFilterProxyModel (QObject *parent = 0);
protected:
bool filterAcceptRow (int sourceRow, const QModelIndex &sourceParent) const;
};
#endif

typeFilrter.h
Код:
#ifndef RTY2
#define RTY2
#include <QWidget>
#include <QModelIndex>
class QAbstractItemModel;
class QTreeView;
class QPushButton;
class MySortFilterProxyModel;
 
class Window : public QWidget
{
Q_OBJECT

public:
Window();
void setSourceModel (QAbstractItemModel *model);

private slots:
void iconFilter();

private:
MySortFilterProxyModel *proxyModel;
QTreeView *proxyView;
QPushButton *readButton;
};
#endif
Записан
Majestio
Гость
« Ответ #20 : Август 20, 2013, 11:50 »

Зависит от задачи. Иконка может быть не декорацией, а именно самими данными. В этом случае нахождение иконки в модели вполне оправдано

И да, и нет) Если идет речь о неких "статических" по времени данных, например, содержимом комбобокса "Настроение". Да конечно! Но, если мы работаем с БД, в которой несколько миллионов записей, а работа идет по низкоскоростным линиям - только и только абстрактная модель и свой кэширующий механизм доступа к данным, которым она пользуется. И никаких данных в модели! Только способ доступа.
Записан
mutineer
Гость
« Ответ #21 : Август 20, 2013, 11:59 »

Код
C++ (Qt)
bool MySortFilterProxyModel::filterAcceptRow (int sourceRow, const QModelIndex &sourceParent) const
{
QModelIndex index0=soutceModel()->index(sourceRow, 0, sourceParent);
return (sourceModel()->data(index0).toString.contains(filterRegExp()));
}
 

Тут ты вытаскиваешь данные из модели по роли Qt::DisplayRole и пытаешься найти в них регексп. А должна вытаскивать по той роли, в которой хранятся фильтруемые данные (в случае приведенного кода Qt::ToolTipRole)

Вообще говоря твоя реализация filterAcceptRow не отличается почти от стандартной, переопределять нет смысла
« Последнее редактирование: Август 20, 2013, 12:17 от mutineer » Записан
helga1917
Гость
« Ответ #22 : Август 20, 2013, 12:56 »

Спасибо  Улыбающийся работает
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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