Полагаю, проблема в QSqlQueryModel :: setQuery , которую вы в конечном итоге вызываете каждый раз, когда содержимое перезагружается и строки вставляются \ удаляются.Глядя на реализацию setQuery, я бы посоветовал: в зависимости от запроса ваша модель может быть сброшена, включая изменение настроек столбцов, что должно вызвать обновление представления столбцов.
Как следует из документации Qt:
Класс QSqlQueryModel предоставляет модель данных только для чтения для наборов результатов SQL.
, поэтому я бы использовал прямой QSqlQuery вызывает обновления данных и затем перезагрузит модель с тем же запросом.Или подумайте о переключении на QSQLTableModel , который очень удобен для манипулирования содержимым одной таблицы и поддерживает вставку обновлений и удалений.Посмотрите, подойдет ли вам приведенный ниже пример:
настроить базу данных, представление и модель:
QSqlTableModel *_model;
QTableView *_view;
...
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
db.open() ;
QSqlQuery query;
query.prepare("CREATE TABLE IF NOT EXISTS person (id INTEGER UNIQUE PRIMARY KEY, name VARCHAR(30))");
query.exec();
query.prepare("INSERT INTO person (name) VALUES ('test1')");
query.exec();
query.prepare("INSERT INTO person (name) VALUES ('test2')");
query.exec();
_model = new QSqlTableModel(this, db);
_model->setTable("person");
_model->setEditStrategy(QSqlTableModel::OnManualSubmit);
_model->select();
_model->setHeaderData(1, Qt::Horizontal, tr("name"));
_model->setSort(1, Qt::AscendingOrder);
_view = new QTableView(this);
_view->setModel(_model);
_view->hideColumn(0);
добавить новую строку:
QSqlRecord record;
_model->insertRecord(-1, record);
удалить выбранные строки:
QModelIndexList selected = _view->selectionModel()->selectedIndexes();
for (int i = 0; i < selected.size(); ++i)
_model->removeRows(selected.at(i).row(), 1);
отправить изменения:
_model->submitAll();
надеюсь, это поможет, с уважением