Название: После setData сделать refresh QSqlQueryModel Отправлено: Alex_C от Май 11, 2012, 15:39 Определил свою модель на основе QSqlQueryModel. Чтобы данные в TableView можно было редактировать, переопределил метод setData у наследника QSqlQueryModel.
Код: bool LogModel::setData(const QModelIndex &index, const QVariant &value, int role) Данные в базу вносятся, но естественно пока для унаследованной модели на refresh() не сделаешь SELECT FROM ... в QTableView отображаются данные что были. Если делать селект всей таблицы, а она не маленькая, то после редактирования получается задержка. Есть ли (а я уверен, что есть) возможность избежать этой задержки? Название: Re: После setData сделать refresh QSqlQueryModel Отправлено: Пантер от Май 11, 2012, 15:44 http://doc-snapshot.qt-project.org/4.8/qabstractitemmodel.html#dataChanged
Название: Re: После setData сделать refresh QSqlQueryModel Отправлено: Alex_C от Май 11, 2012, 16:59 http://doc-snapshot.qt-project.org/4.8/qabstractitemmodel.html#dataChanged Да спасибо, но я это видел, но так до конца не понял как этим воспользоваться именно в моем случае. Пытался сделать так : Код: bool LogModel::setData(const QModelIndex &index, const QVariant &value, int role) И далее отлавтиваем сигнал dataChanged в QTableView Код: void LogTableView::slot_modelDataChange(const QModelIndex &topLeft, const QModelIndex &bottomRight) Все отлавливается, но данные в QTableView так и не изменились. Название: Re: После setData сделать refresh QSqlQueryModel Отправлено: Пантер от Май 11, 2012, 19:14 Ловить сигнал не нужно, вьюха сама должна его обработать.
Название: Re: После setData сделать refresh QSqlQueryModel Отправлено: Alex_C от Май 12, 2012, 12:13 Все таки не получается.
А вот эта строка правильная - Код: QSqlQueryModel::setData(index, value); Я правильно в модели данные меняю? Название: Re: После setData сделать refresh QSqlQueryModel Отправлено: Странник от Май 12, 2012, 12:20 Все таки не получается. есть подозрение, что QSqlQueryModel::setData, как бы это помягче, does nothing. и возвращать false должна, по идее. вам нужно написать свою реализацию setData и при успешном изменении эмиттить dataChanged().А вот эта строка правильная - Код: QSqlQueryModel::setData(index, value); Я правильно в модели данные меняю? Название: Re: После setData сделать refresh QSqlQueryModel Отправлено: Alex_C от Май 12, 2012, 13:55 См мои сообщения 1 и 3 - так я setData и переопределяю у своей модели - LogModel.
В строках Код: QSqlQuery query; я как раз заношу физически данные в базу. А теперь задача - обновить модель, которая показывается, не перечитывая все данные опять с диска. И Пантер, как я понимаю, совет абсолютно правильный дал. Но вот конкретно реализовать пока не получилось. Те примеры, что я в инете нашел - там все на примере QStringModel сделано - что естественно на порядок проще. Название: Re: После setData сделать refresh QSqlQueryModel Отправлено: Пантер от Май 12, 2012, 13:57 Не хочу тебя расстраивать, но походу не получится - QSqlQueryModel кеширует у себя данные. Так что, походу, придется писать свою модель.
Название: Re: После setData сделать refresh QSqlQueryModel Отправлено: Alex_C от Май 12, 2012, 14:01 Да, по ходу так и есть, ничего кроме этого не нашел -
Код: bool EditableSqlModel::setData(const QModelIndex &index, const QVariant &value, int /* role */) Это из официальной доки... Только перечитывать все данные... Но все таки по моему не может быть - задача то очень распространенная. Название: Re: После setData сделать refresh QSqlQueryModel Отправлено: Alex_C от Май 13, 2012, 10:38 В общем проблему решил. Не так конечно , как хотелось, но на данном этапе пойдет.
1. Все же отлавливаем emit dataChanged(index, index); в QTableView. 2. В QTableView Код: void LogTableView::slot_modelDataChange(const QModelIndex &topLeft, const QModelIndex &bottomRight) tableModel - это qobject_cast на мою переопределенную модель, т.к. abstractmodel не имеет методов setQuery. Пока правда не понял - в некоторых случаях индекс устанавливается после редактирования правильно, а в некоторых случаях на 2 строки выше. Название: Re: После setData сделать refresh QSqlQueryModel Отправлено: Alex_C от Май 13, 2012, 10:49 Не хочу тебя расстраивать, но походу не получится - QSqlQueryModel кеширует у себя данные. Так что, походу, придется писать свою модель. И все же - должно получиться. Я вот что подумал - QSqlTableModel - это наследник QSqlQueryModel. А у QSqlTableModel есть editStrategy - т.е. данные в модели меняются, а на диске - нет. Следовательно можно сделать так, как я и хочу - менять отдельно данные в модели и отдельно на диске. Осталось дело за малым - разобраться как это сделано в QSqlTableModel :) |