在QSqlQueryModel
上设置INSERT或DELETE查询后,我的QTableView
变得搞砸了。例如,我通过调用view->hideColumn(ID);
来隐藏ID列,但在INSERT或DELETE之后,ID列变为可见。
在这些情况下,如何自动将视图重置为之前的设置?
答案 0 :(得分:4)
我想问题出现在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();
希望这有帮助,尊重