LINUX.ORG.RU

Использование QSortFilterProxyModel

 ,


0

1

Помогите, пожалуйста, разобраться в правильной эксплуатации модели-посредника.

Использую модель-посредник QSortFilterProxyModel для фильтрации строк одной из таблиц. Все остальные таблицы в фильтрации не нуждаются и управляются моделью QSqlRelationalTableModel.

Логика работы организована так:

QSortFilterProxyModel *proxy;
QSqlRelationalTableModel *model;
MyView *view;

// в конструкторе
view = new MyView

// в методе открытии документа
model = new QSqlRelationalTableModel(this);
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
proxy = new QSortFilterProxyModel(this);
proxy->setSourceModel(model);

// при выборе таблицы для работы (редактирования)
    // для всех таблиц (кроме одной)
    view->setModel(model);
    // для одной
    view->setModel(proxy);

// в методе сохранения действую так:
QSqlTableModel *md = qobject_cast<QSqlTableModel*>(model()); // вот здесь то и проблема
md->database().transaction();
// ...

Поблема такая: md для таблиц работающих с model не пустое (правильное), а вот для одной таблицы, работающий с proxy --- md=0.

Как правильно заполучить в md модель-посредник? или, может быть здесь д.б. настоящая модель, ведь ничего же не фильтруется при сохранении. Тогда, как правильно заполучить модель?

Поблема такая: md для таблиц работающих с model не пустое (правильное), а вот для одной таблицы, работающий с proxy --- md=0.

Естественно, ты же пытаешься кастовать объект типа QSortFilterProxyModel к типу QSqlTableModel.

grondek
()
Последнее исправление: grondek (всего исправлений: 1)
Ответ на: комментарий от grondek

как переделать, чтобы и для объекта QSortFilterProxyModel и для объекта QSqlRelationalTableModel код подходил

developer-cpp
() автор топика

У прокси-модели есть метод sourceModel, которая в твоем случае вернет sql модель. Если ты хочешь страда^Wна этом уровне абстракции работать с разными моделями во view, проверяй, какого она типа, и в случае прокси вызывай sourceModel.

staseg ★★★★★
()
Ответ на: комментарий от staseg

Примерно так:

QSqlTableModel *md = 0;
if(QAbstractProxyModel *proxy = qobject_cast<QAbstractProxyModel*>(model()))
    md = proxy->sourceModel();
else if(QSqlTableModel *sql = qobject_cast<QSqlTableModel*>(model()))
    md = proxy;

if(md != 0){
    md->database().transaction();
    ...
}

Но это скорее быдлокод чем наоборот. Лучше не устраивать такую кашу, а подумать, как архитектурно отделить мух от котлет.

staseg ★★★★★
()
Ответ на: комментарий от staseg

Лучше хранить указатели на сами модели и работать непосредственно с ними.

grondek
()
Ответ на: комментарий от staseg

Но это скорее быдлокод чем наоборот. Лучше не устраивать такую кашу, а подумать, как архитектурно отделить мух от котлет.

Лучше хранить указатели на сами модели и работать непосредственно с ними.

Да вроде думал над архитектурой ) и решил обсудить.

У меня модель, прокси и редставления храняться в классе документа. Причем класс для представления является наследником QTableView и хранить в нем указатель на модель я не стал (как бы представление отдельно, а модель отдельно). Поэтому так вот и «вычисляю» модель.

Наверное, лучший вариант создать поле для хранения указателя на модель в классе представления + метод установки модели? А в классе документа поискать подходящее место для вызова метода установки модели.

developer-cpp
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.