LINUX.ORG.RU

[QSqlRelationalTableModel] Как обновлять данные автоматом.


0

1

Подключаюсь к БД, создаю модель QSqlRelationalTableModel, устанавливаю таблицу и вывожу в TableView. Не могу найти как автоматически обновлять данные в модели и соответственно в TableView. Пока на ум приходит только использование таймера и вызов model->select();. Может есть другие способы?

 QSqlRelationalTableModel *model = new QSqlRelationalTableModel();

 model->setTable("sometable");

 model->setEditStrategy(QSqlTableModel::OnFieldChange);

 model->select();

 model->setHeaderData(0, Qt::Horizontal,QObject::tr("Номер\nзаписи"));

 model->setHeaderData(1, Qt::Horizontal,QObject::tr("Время"));

 model->setHeaderData(2, Qt::Horizontal,QObject::tr("Сообщение"));

 ui->tv->setModel(model);

> как автоматически обновлять данные
А какие условия обновления данных Вы предполагаете?

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

В БД добавляются новые записи, никаких условий по выборке пока нет, хочу всю таблицу выводить + постоянно пополняемые записи.

Andrey325
() автор топика
Ответ на: комментарий от Andrey325

Тогда необходимо либо создать механизм, с помощью которого БД будет оповещать об изменении таблицы, либо использовать вариант с таймером, но это сильно смахивает на костыль.

В своем приложении я создавал отдельный демон, через который шли все обращения к базе и который уведомлял клиентов об изменениях.

trex6 ★★★★★
()

Фактически TableView это всего лишь ЮИ рендерер твоей модели :) Данных в TableView в реальности нет. Все данные живут в модели.
т.о. если почитать немного доки по QAbstractItemModel и перегрузить пару виртуальных функций - ты получишь то что хочешь. Там все просто :)

Jetty ★★★★★
()

Вижу, кстати, что доку совсем не читал. Т.к. как минимум надо перегрузить QAbstractItemModel::flags

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

Там совершенно пофиг какой ты *SQL используешь, главное что бы Qt имел соответствующий драйвер.

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

> по таймеру апдейтить модель
Не самое лучшее решение. Как я понял, ТС как раз не мог понять, каким образом правильно получать информацию о том, что в БД произошли изменения.

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

А как ты собираешься узнать о том что данные в БД изменились? Только проводя периодическую проверку.

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

В данном случае model/view здесь никакого значения не имеют. надо смотреть драйвер БД.

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

Jetty

А как ты собираешься узнать о том что данные в БД изменились? Только проводя периодическую проверку.

Как же так, а триггеры? QSqlDriver::subscribeToNotification и сигнал QSqlDriver::notification

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

А как подписку на MySQL сделать? В PostgreSQL триггером c NOTIFY в BEGIN. Что то не могу найти похожей команды в MySQL.

Andrey325
() автор топика
Ответ на: комментарий от Andrey325

Не знаю, никогда не работал с mysql, только с постгре.

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