【问题标题】:Qt: updating database model through viewQt:通过视图更新数据库模型
【发布时间】:2017-07-20 08:43:46
【问题描述】:

当我尝试通过视图更新 SQLite 数据库时,我遇到了一个奇怪的行为。根据我使用的编辑策略,我可以更新视图或更新数据库,但我无法更新数据库并让视图显示新值。

基本上,我使用以下代码:

auto sdb = QSqlDatabase::addDatabase("QSQLITE");
sdb.setDatabaseName("database.db");

QSqlTableModel *model = new QSqlTableModel(0, sdb);
model->setTable("table");

//model->setEditStrategy(QSqlTableModel::OnFieldChange);
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();

QTableView *tv = new QTableView();
tv->setModel(model);
tv->show();

// I'm not sure, this connect statement is needed.
// Either way, it does not change the behavior of the problem I observe
connect(model,
        SIGNAL(dataChanged(const QModelIndex &,
                           const QModelIndex &,
                           const QVector<int> &)),
        tv,
        SLOT(dataChanged(const QModelIndex &,
                         const QModelIndex &,
                         const QVector<int> &)));

当我使用QSqlTableModel::OnManualSubmit

视图发生变化,但底层数据库没有得到更新。 IE。重新启动应用程序(或重新加载数据库)不会更新该字段。我猜这很明显,因为我必须手动将更改“提交”到底层数据库。

当我使用QSqlTableModel::OnFieldChange

在编辑视图后按回车键后,视图(对于已编辑的行)变为空白。底层数据库得到更新,我可以在数据库中看到,但不知何故,视图没有获得新值。

【问题讨论】:

  • 我没有在模型/视图中使用过数据库,但我的建议是:如果事情变得奇怪并且您不知道如何继续,请考虑创建一个委托并手动处理数据编辑。
  • 你在哪个平台上?一些次要平台上的数据库驱动插件有很多错误
  • 我的次要平台是 Linux (RedHat)。使用委托似乎是一个好建议!不幸的是,它仍然表现出相同的行为。
  • 嗯,我以为我可以通过使用委托来让它工作,但不幸的是,它仍然不起作用。委托发出信号后,视图(和更改)在编辑后看起来还不错。但是当将焦点从单元格上移开时,整个表格行再次变为空,和以前一样。 -- 如果是DB驱动的问题,你觉得我有办法解决吗?

标签: c++ qt sqlite model-view


【解决方案1】:

看来我的问题是 SQLite 数据库中的一列缺少“主键”。通过编辑视图,数据库可以成功更新,但不知何故,更改没有正确转发到视图

用其中一列作为主键创建一个新表,解决了这个问题。

【讨论】:

  • 感谢 cmets,原来不需要委托。只需制作 SQLite 列 PRIMARY KEY 之一,即可使 QSqlTableModel 与 Qt 的模型/视图接口很好地配合。
猜你喜欢
  • 1970-01-01
  • 2016-01-08
  • 2012-04-29
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多