【问题标题】:Why do INSERT and DELETE screw up QTableView (Qt, C++, sqlite)?为什么 INSERT 和 DELETE 搞砸了 QTableView(Qt、C++、sqlite)?
【发布时间】:2011-06-25 19:24:55
【问题描述】:

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

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

【问题讨论】:

  • 张贴一些代码,在初始化模型和视图的地方使用 sn-ps 会很有帮助。
  • 整个代码都可以在这里找到,修订版 1751:szte-wsn.svn.sourceforge.net/viewvc/szte-wsn/private/ali/SQL/… 奇怪的是:SELECT 不会弄乱我的视图,只有 INSERT 和 DELETE 会。我猜他们会触发一些东西来重置视图的先前设置。

标签: c++ sql qt qt4 pyqt


【解决方案1】:

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

希望这会有所帮助,问候

【讨论】:

  • +1 非常感谢!我会试试你的解决方案,然后回到这里!
  • 目前直接调用 QSqlQuery 似乎是解决手头问题的最佳选择。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-04
  • 2012-05-11
  • 2018-11-05
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多