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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: QSqlQueryModel и нормальный refresh  (Прочитано 17776 раз)
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #15 : Сентябрь 25, 2014, 10:47 »

1. собственно обновление изменившихся данных (новые/удаленные/изменившиеся строки) - это собственно сделано;
Есть подозрение, что если нормально обновлять модель (испускать соответствующие сигналы), то вью сама должна нормально позиционировать текущий элемент и вьюпорт.
Записан

Qt 5.11/4.8.7 (X11/Win)
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #16 : Сентябрь 25, 2014, 13:07 »

если нормально обновлять модель (испускать соответствующие сигналы), то вью сама должна нормально позиционировать текущий элемент и вьюпорт.
И ещё раз: есть 2 разных компа с моими приложениями. На PC1 пользователь удалил запись, которая является в этот момент текущей во вью на PC2. Кто, кому и какой должен испустить сигнал, чтобы при обновлении вью на PC2 текущей стала "ожидаемая строка"?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #17 : Сентябрь 25, 2014, 13:10 »

И ещё раз: есть 2 разных компа с моими приложениями. На PC1 пользователь удалил запись, которая является в этот момент текущей во вью на PC2. Кто, кому и какой должен испустить сигнал, чтобы при обновлении вью на PC2 текущей стала "ожидаемая строка"?
У меня база посылает уведомление о изменении таблицы (добавление/изменение/удаление записи) и все модели на всех рабочих местах добавляют/перечитывают/удаляют нужную строку.
База postgresql.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #18 : Сентябрь 25, 2014, 13:18 »

И ещё раз: есть 2 разных компа с моими приложениями. На PC1 пользователь удалил запись, которая является в этот момент текущей во вью на PC2. Кто, кому и какой должен испустить сигнал, чтобы при обновлении вью на PC2 текущей стала "ожидаемая строка"?
Каким образом обновляется модель на PC2?
Записан

Qt 5.11/4.8.7 (X11/Win)
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #19 : Сентябрь 25, 2014, 13:25 »

У меня база посылает уведомление о изменении таблицы (добавление/изменение/удаление записи) и все модели на всех рабочих местах добавляют/перечитывают/удаляют нужную строку.
База postgresql.
Таковым механизмом обладают далеко не все СУБД. В таком случае - либо кнопка рефреша, либо костыль с таймером.
У меня при выборе СУБД для проекта наличие механизма нотификации дало серьезное преимущество для Постгре.
« Последнее редактирование: Сентябрь 25, 2014, 13:27 от Hellraiser » Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #20 : Сентябрь 25, 2014, 13:26 »

Каким образом обновляется модель на PC2?
По нажатию кнопки "Refresh".

У меня база посылает уведомление о изменении таблицы.
Уходим в сторону от изначального вопроса, который заключался не в этом, а в том, как "ожидаемо" спозиционироваться на строку после рефреша, если предыдущая текущая запись была удалена. Плюс мне такой подход с автоматическим обновлением по уведомлению об изменении не подойдет: изменения происходят слишком часто - в этом режиме работать с таблицей будет невозможно. Кстати, как узнаёте, что инициатором изменения была текущая модель, и, следовательно, специально обновляться не надо?
« Последнее редактирование: Сентябрь 25, 2014, 13:32 от xokc » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #21 : Сентябрь 25, 2014, 13:27 »

Таковым механизмом обладают далеко не все СУБД. В таком случае - либо кнопка рефреша, либо костыль с таймером.
Мало того, ни каждая система и клиент может выдержать нагрузку используя такой механизм.
Записан

Qt 5.11/4.8.7 (X11/Win)
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #22 : Сентябрь 25, 2014, 13:29 »

По нажатию кнопки "Refresh".
Ну что за ответ Непонимающий
Тебе хотят помочь, а ты кривляешься. Как-то даже не серьёзно.  Грустный
« Последнее редактирование: Сентябрь 25, 2014, 13:31 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #23 : Сентябрь 25, 2014, 13:39 »

По нажатию кнопки "Refresh".
Ну что за ответ Непонимающий
Тебе хотят помочь, а ты кривляешься. Как-то даже не серьёзно.  Грустный
Ну какой вопрос, такой и ответ Улыбающийся. Ничуть не кривлялся. Если вопрос был о механизме обновления, а не о его инициаторе (а я его понял именно так Улыбающийся), то - так, как это сделано в примере из состава Qt (examples\sql\querymodel\editablesqlmodel.cpp), а именно:
Код
C++ (Qt)
void EditableSqlModel::refresh()
{
   setQuery("select ...");
}
Тебе хотят помочь
От помощи не откажусь и буду благодарен - для того и вопрос задавал.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #24 : Сентябрь 25, 2014, 13:56 »

Получается, что модель при обновлении полностью чистится. Поэтому вью тоже сбрасывается.
Тут есть 2 решения, либо написать свою модель с нормальным рефрешем либо держать 2 QSqlQueryModel-и.
Первая основная, а вторая временная для валидации первой.
« Последнее редактирование: Сентябрь 25, 2014, 14:14 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #25 : Сентябрь 25, 2014, 13:59 »

Кстати, как узнаёте, что инициатором изменения была текущая модель, и, следовательно, специально обновляться не надо?
У меня все действия с таблицей можно выполнять только через методы модели, поэтому внутримодельного флага достаточно.
Я не использую Qt-модели для работы с базами, сразу написал свои со всякими "плюшками".
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #26 : Сентябрь 25, 2014, 14:02 »

Получается, что модель при обновлении полностью чистится. Поэтому вью тоже сбрасывается.
Тут есть 2 решения, либо написать свою модель с нормальным рефрешем либо держать 2 QSqlQueryModel-и.
Первая основная, а вторая временная для валидации первой.
Достаточно хранить список с уникальными id записей. Перед рефрешем заполняем его, после смотрим что изменилось.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #27 : Сентябрь 25, 2014, 14:07 »

Достаточно хранить список с уникальными id записей. Перед рефрешем заполняем его, после смотрим что изменилось.
Да, так будет ещё оптимальнее.
Записан

Qt 5.11/4.8.7 (X11/Win)
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #28 : Сентябрь 25, 2014, 14:13 »

Спасибо за ответы, вижу, что простого решения нет - жаль. Ну и пользуясь случаем: у меня в модели есть "вычисляемое" поле, то есть то поле, которого нет в БД (значение из модели отдается через model::data()). Как мне при его изменении (не средствами View) наиболее правильно оповестить View о том, что надо бы это значение перерисовать без полного refresh (как сделано в примере editablemodel) модели?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #29 : Сентябрь 25, 2014, 14:20 »

Код
C++ (Qt)
QTableVeiw::viewport()->update();
QTableVeiw::viewport()->update( QTableVeiw::visualRect( index ) );
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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