为什么INSERT和DELETE搞砸了QTableView(Qt,C ++,sqlite)?(Why do INSERT and DELETE screw up QTableView (Qt, C++

编程入门 行业动态 更新时间:2024-10-22 16:37:41
为什么INSERT和DELETE搞砸了QTableView(Qt,C ++,sqlite)?(Why do INSERT and DELETE screw up QTableView (Qt, C++, sqlite)?)

在QSqlQueryModel上设置INSERT或DELETE查询QSqlQueryModel ,我的QTableView变得搞砸了。 例如,我通过调用view->hideColumn(ID);隐藏ID列view->hideColumn(ID); 但在INSERT或DELETE之后,ID列变为可见。

在这些情况下,如何自动将视图重置为先前的设置?

After setting an INSERT or DELETE query on QSqlQueryModel, my QTableView becomes screwed up. For example I hid the ID column by calling view->hideColumn(ID); but after an INSERT or DELETE the ID column becomes visible.

How can I automatically reset my view to the previous settings in these cases?

最满意答案

我想问题是在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();

希望这会有所帮助,问候

I guess the problem is in QSqlQueryModel::setQuery you're eventually calling every time content gets reloaded and rows inserts\deletes. Looking at the setQuery implementation I would suggest: depending on the query your model can be reset including columns settings change which should trigger view columns update.

As Qt documentation suggests:

The QSqlQueryModel class provides a read-only data model for SQL result sets.

so I would use direct QSqlQuery calls for the data updates and then would reload the model with the same query. Or consider switching to QSQLTableModel, which is quite handy for single table content manipulation and supports inserts updates and deletes. See if an example below would work for you:

set up database, view and model:

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);

add new row:

QSqlRecord record; _model->insertRecord(-1, record);

delete selected row(s):

QModelIndexList selected = _view->selectionModel()->selectedIndexes(); for (int i = 0; i < selected.size(); ++i) _model->removeRows(selected.at(i).row(), 1);

submit changes:

_model->submitAll();

hope this helps, regards

更多推荐

本文发布于:2023-04-29 08:17:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1335914.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:砸了   DELETE   INSERT   QTableView   screw

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!