2015-01-25 2 views
1

Я использую базу данных SQLite с QSqlDatabase и показываю данные, используя 2 QTableView с QSqlTableModels.QSqlDatabase и QTableView не синхронизируются (SQLite)

Мое приложение вставляет данные в таблицы с использованием QSqlQuery, но таблицы не обновляются, чтобы отображать новые данные (например, число отображаемых строк не изменяется). Я ожидал, что новые данные будут автоматически отображены в QTableView.

Что я здесь делаю неправильно?

+1

Это не волшебство; SQLite не выводит никаких уведомлений на Qt, чтобы обновлять такие представления. – peppe

+2

Возможный дубликат [Автоматическое обновление QSqlTableModel/QTableView при изменении базовой таблицы SQL из-за пределов моего приложения] (http://stackoverflow.com/questions/26365301/auto-refresh-qsqltablemodel-qtableview-when- the-underlying -sql-table-is-changed) – sashoalm

+0

Таймер, выполняющий запрос select в событии тайм-аута, мог бы сделать трюк и не стал таким дорогостоящим. –

ответ

1

Эта функция не поддерживается Qt. Когда таблица изменена, нет механизма уведомления для обновления модели и автоматического просмотра. Хотя вы можете сделать это в PostgreSQL каким-то образом, как указано here, но в SQLite вам необходимо периодически запрашивать базу данных и обновлять вид, который является дорогостоящим. Другим вариантом является использование QFileSystemWatcher поймать изменения файлов и обновить представление о времени:

QFileSystemWatcher *databaseWatcher = new QFileSystemWatcher(this); 
databaseWatcher->addPath("Path/To/database.sqlite"); 
QObject::connect(databaseWatcher, SIGNAL(fileChanged(QString)), this, SLOT(refreshView())); 

Теперь часы файл базы данных и когда все это изменяется внешний процесс или вашей собственной личности, fileChanged сигнал излучается и Вызывается слот refreshView, в котором вы должны обновить модель и просмотреть.