Название: QSqlQueryModel + QSortFilterProxyModel + QTableView - обновление Отправлено: root от Июнь 28, 2010, 07:06 Имею такую связку как в сабже, все это дело нужно только для отображения, фильтрации и сортировки данных из базы. Содержимое базы меняется разными клиентами. Требуется чтобы вьюха отображала актуальные данные.
Пробывал по разному - ничего не добился. Последний вариант вот такой: наследуюсь от QSqlQueryModel, создаю публичный метод: Код: void CustQueryModel::updateModel() { так же создаю публичный метод: Код: void FilterModel::updateMe() { (model - объект CustQueryModel(от QSqlQueryModel); filterModel - объект FilterModel(от QSortFilterModel); tableView - объект QTableView) Код: void ViewQuerys::updateTable() { как победить данную проблему не знаю, прошу помощи... Название: Re: QSqlQueryModel + QSortFilterProxyModel + QTableView - обновление Отправлено: asvil от Июнь 28, 2010, 07:29 QSqlQueryModel::reset() это сигнал. Сигнал ничего не делает кроме оповещения других участников программы о чем-либо.
Для того чтобы обновить QSqlQueryModel нужно повторно установить запрос в нее. Название: Re: QSqlQueryModel + QSortFilterProxyModel + QTableView - обновление Отправлено: BRE от Июнь 28, 2010, 08:14 QSqlQueryModel::reset() это сигнал. Сигнал?void QAbstractItemModel::reset () [protected] Название: Re: QSqlQueryModel + QSortFilterProxyModel + QTableView - обновление Отправлено: asvil от Июнь 28, 2010, 08:28 )Да, не прав. modelReset() - это сигнал. А reset() его впоследствии генерирует.
Так или иначе reset() не способствует обновлению Sql модели. Название: Re: QSqlQueryModel + QSortFilterProxyModel + QTableView - обновление Отправлено: root от Июнь 29, 2010, 06:37 Для того чтобы обновить QSqlQueryModel нужно повторно установить запрос в нее. устанавливал - не помогло..... к тому же Код: model->query().exec() Как же быть-то? самостоятельно решить проблему не получается.... Мож кто подскажет куда рыть? Может ли переопределение методов flags, data, filterAcceptsRow влиять на обновление модели? Название: Re: QSqlQueryModel + QSortFilterProxyModel + QTableView - обновление Отправлено: asvil от Июнь 29, 2010, 06:58 Так: QSqlQueryModel::setQuery(QSqlQueryModel::query())?
Возможно лучше так QSqlQueryModel::setQuery(QSqlQueryModel::query().lastQuery(), QSqlQueryModel::query().database()) Название: Re: QSqlQueryModel + QSortFilterProxyModel + QTableView - обновление Отправлено: root от Июнь 29, 2010, 08:16 Проблему решил.
Сработал следущий способ: 1. Для QSqlQueryModel, устанавливаю повторно запрос 2. Выполняю его. 3. Вызываю свой метод в своей прокси модели, в котором вызывается reset() Относительно кода в первом посте: Код: void ViewQueries::updateTable() { Код: void FilterModel::updateMe() { Скажу так же, что вызов layoutAboutToBeChanged(); layoutChanged() и т.д., вместо reset ничем не помогает. Если запрос не выполнить, то результата тоже не будет.... вот почему-то так. Цитировать Так: QSqlQueryModel::setQuery(QSqlQueryModel::query())? да.Цитировать Возможно лучше так QSqlQueryModel::setQuery(QSqlQueryModel::query().lastQuery(), QSqlQueryModel::query().database()) возможно. Попробую. Спасибо за участие.Название: Re: QSqlQueryModel + QSortFilterProxyModel + QTableView - обновление Отправлено: asvil от Июнь 29, 2010, 08:30 QSortFilterProxyModel::dynamicSortFilter установлен в true?
Название: Re: QSqlQueryModel + QSortFilterProxyModel + QTableView - обновление Отправлено: root от Июнь 29, 2010, 08:34 QSortFilterProxyModel::dynamicSortFilter установлен в true? дакстати, у мну нету метода database(), у объекта запрос. версия qt - 4.6.2 еще одно кстати, мое решение описанное выше, срабатывает почему-то только если весь алгоритм выполнить дважды.... теперь ломаю голову, почему так... ??? Название: Re: QSqlQueryModel + QSortFilterProxyModel + QTableView - обновление Отправлено: asvil от Июнь 29, 2010, 08:45 if(model->query().exec()) {
// Здесь нужно сделать так чтобы прокси модель узнала, что model изменилась // Для этого нужно сделать QSqlQueryModel::reset(), но он protected filterModel->updateMe(); } Значит наверно нужно сделать метод QSqlQueryModel::refresh() { query().exec(); reset(); } А вообще сама QSqlTableModel обновляет себя так: Код: QString query = selectStatement(); Название: Re: QSqlQueryModel + QSortFilterProxyModel + QTableView - обновление Отправлено: asvil от Июнь 29, 2010, 08:48 Цитировать кстати, у мну нету метода database(), у объекта запрос. версия qt - 4.6.2 Это я навскидку про database писал.Название: Re: QSqlQueryModel + QSortFilterProxyModel + QTableView - обновление Отправлено: root от Июнь 29, 2010, 09:01 отнаследовался опять QSqlQueryModel, добавил метод
Код: QSqlQueryModel::refresh() результат тот же, как и в первом моем решении... обновляется только после повторения алгоритма 2 раза..... Название: Re: QSqlQueryModel + QSortFilterProxyModel + QTableView - обновление Отправлено: root от Июнь 30, 2010, 05:43 Решил проблему с необходимостью повтора алгоритма 2 раза. Но возникла новая :)
Значит новый алгоритм следующий: 1. Выполняем запрос 2. Устанавливаем активный запрос в модель 3. ресетим проксю То есть переписываем так: (query - объект QSqlQuery, model - объект QSqlQueryModel, filterModel - объект наследника QSortFilterProxyModel) Код: void ViewQueries::updateTable() { Метод refresh в своей проксе: Код: void FilterModel::refresh() { А новая пробема в следующем: Мой запрос выберает данные из нескольких таблиц, но не все возращаемые им поля надо отображать во вьюхе, поэтому некоторые столбцы во вьюхе у меня скрываются. Так вот, если результат запроса меняется в сторону увеличения (т.е. добавились новые строки), то после обновления вьюха отображает все корректно, с первого раза. А если результат запроса меньше, то после обновления количество строк вьюха отображает верно, но только почему то отображаются все поля запроса, даже те которые я скрывал во вьюхе. Приходится после обновления фиксить настройки отображения столбцов во вьюхе..... |