webhamster
@webhamster

Qt: Как использовать QSortFilterProxyModel совместно с видом?

У меня есть проект, в котором до недавнего времени использовалась модель 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 есть одинаковые методы, и скомпилировать такой код не получается.
  • Вопрос задан
  • 4323 просмотра
Пригласить эксперта
Ответы на вопрос 1
Demonist
@Demonist
А Вам и не нужно управлять данными через прокси-модель. Делайте это напрямую с RecordTableModel, а QSortFilterProxyModel будет лишь сортировать.
Поймите, данные должны храниться только в модели (т.е. в RecordTableModel) и именно она должна с ними работать, и больше никто. QSortFilterProxyModel в таком случае будет толкьо менять формат отображения этих данных, но не сами данные.

Рекомендую подтянуть знания касательно моделей. Сделать это можно, например, здесь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы