【发布时间】: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