2015-02-25 10 views
2

В QTableView с QSqlQueryModel, каков правильный способ обновить представление при вставке новой строки? Я вижу, что перезагрузка модели с просмотром работает, но я не думаю, что это правильный способ сделать это.Обновление QTableView при вставке строки

Простой фрагмент кода должен помочь.

ответ

5

Зависит от того, как вы вставляете новые данные в базу данных.

Если вы просто сделать QSqlQuery query("INSERT INTO .... ") где-то в коде, тогда единственный способ обновления QSqlQueryModel это сбросить его, потому что QSqlQueryModel не самообновляющаяся - это просто выполняет запрос и дает результаты. Он не может просить базу данных дать ей «новые данные», поскольку база данных не знает, какие «новые данные» относятся к модели, и нет «push-уведомлений» из баз данных (обычно).

Я бы рекомендовал использовать QSqlTableModel, что позволяет также вставлять новые строки, и модель автоматически запускает запрос INSERT для сохранения новых данных в базе данных. Он также допускает модификации ("UPDATE ...").

// Setup the model 
QSqlTableModel *model = new QSqlTableModel(this, database); 
model->setTable("myTable"); 
model->setEditStrategy(QSqlTableModel::OnManualSubmit); 
model->select(); // will populate the model 

... 
... 

// Insert new row and data 
const int row = model->rowCount(); 
model->insertRows(row, 1); 
model->setData(model->index(row, 0), "First column value"); 
model->setData(model->index(row, 1), "Second column value"); 
// Commit the new record into database 
model->submitAll(); // submit 

Как вы можете видеть, QSqlTableModel почти полностью скрывает SQL поддержку от вас, и вы используете его, как если бы вы имели дело с обычной моделью.

+0

спасибо за ваш ответ. Мое приложение требует отфильтрованных данных, поэтому мне нужно использовать модель QSqlQueryModel, также я не вижу метод submitAll в QSqlQueryModel, поэтому, возможно, я не могу вставлять эту модель. – Kamath

+1

@ Kamath вы можете фильтровать данные в QSqlTableModel с помощью функции setFilter(). – iamantony

0

Как я еще не разрешил написать комментарий, вот как (дополнительный) ответ:

Как писал Даниэль Vrátil, вы должны использовать QSqlTableModell, так как он обрабатывает вставку. Вы прокомментировали, что вам нужно фильтры, и вы можете сделать это также с TableModel: , например:

model->setFilter("errorlog_permission < 3");

, что приведет именно в ИНЕКЕ запроса.

Смежные вопросы