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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как использовать QSortFilterProxyModel совместно с видом?  (Прочитано 4591 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Май 11, 2015, 22:13 »

У меня есть проект, в котором до недавнего времени использовалась модель RecordTableModel, расширенная от класса QAbstractTableModel. У этой модели, помимо переопределенных стандартных методов, были добавлены дополнительные методы, которые упрощали взаимодействие вида и модели:

Код:
void RecordTableModel::setTableData(RecordTableData *rtData)
RecordTableData *RecordTableModel::getTableData(void)
int RecordTableModel::addTableData(int mode,
                                   int pos,
                                   QMap<QString, QString> fields,
                                   QString text,
                                   QMap<QString, QByteArray> files)
void RecordTableModel::removeRowsByList(QVector<int> delIdx)

Теперь пришло время сделать возможность сортировки в виде. Для этого модель RecordTableModel надо заменить на QSortFilterProxyModel. Внутри вида я создаю объект типа RecordTableModel, создаю объект типа QSortFilterProxyModel, устанавливаю для прокси-модели исходную модель через setSourceModel(), и начинаю пытаться использовать объект класса QSortFilterProxyModel:

Код:
// Было
 recordModel=new RecordTableModel();
 setModel(recordModel);

 ...

 // Стало
 recordSourceModel=new RecordTableModel();

 recordModel=new QSortFilterProxyModel();
 recordModel->setSourceModel(recordSourceModel);

 setModel(recordModel);

Но оказывается, что класс QSortFilterProxyModel не умеет вызывать методы класса Source-модели, заданной через setSourceModel().

Как же мне теперь управляться с данными через прокси-модель? Ведь в ней недоступны методы основной модели. Я пытался применить множественное наследование, создав класс, унаследованный от RecordTableModel и QSortFilterProxyModel. Но у QAbstractTableModel (от которого унаследован RecordTableModel) и QSortFilterProxyModel есть одинаковые методы, и скомпилировать такой код не получается.
Записан

Собираю информацию по крупицам
http://webhamster.ru
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #1 : Май 11, 2015, 23:32 »


Как же мне теперь управляться с данными через прокси-модель? Ведь в ней недоступны методы основной модели. Я пытался применить множественное наследование, создав класс, унаследованный от RecordTableModel и QSortFilterProxyModel. Но у QAbstractTableModel (от которого унаследован RecordTableModel) и QSortFilterProxyModel есть одинаковые методы, и скомпилировать такой код не получается.


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

Цитировать
Но оказывается, что класс QSortFilterProxyModel не умеет вызывать методы класса Source-модели, заданной через setSourceModel().

Зачем вызывать методы из прокси модели? Почему не вызывать их из представления?

У меня тоже практически все данные которые требуют сортировки или фильтрации построены точно таким образом:

Код:
c_model = new sCreateElDocModel(this);
    c_model->fill(data, from_eld);

    c_proxy = new QSortFilterProxyModel(this);
    c_proxy->setSourceModel(c_model);

    c_view = new sTableViewElDoc(this);
    c_view->setModel(c_proxy);
« Последнее редактирование: Май 11, 2015, 23:47 от PimenS » Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #2 : Май 12, 2015, 00:09 »

> Немного не понял этой фразы:
> "Но оказывается, что класс QSortFilterProxyModel не умеет вызывать методы класса Source-модели, заданной через setSourceModel()"
> Зачем вызывать методы из прокси модели? Почему не вызывать их из представления?

Ну я просто расчитывал заменить одну модель другой (как это и положено в концепции MVC).

Методы модели и вызываются из представления. Но вызываются-то они у модели, и если модель поменялась, и методов нет, то ничего не работает.
Записан

Собираю информацию по крупицам
http://webhamster.ru
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #3 : Май 12, 2015, 00:15 »

QSortFilterProxyModel не хранит данных. Поэтому все равно нужно иметь модель с данными + прокси-модель + представление.

Цитировать
Ну я просто расчитывал заменить одну модель другой

Вряд ли это удобно. Теоретически можно конечно и QSortFilterProxyModel использовать для хранения данных, но дорого.
« Последнее редактирование: Май 12, 2015, 00:25 от PimenS » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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