我已经实现了Oracle数据库。我使用Qt作为我的应用程序的GUI,并作为db的接口。设置与我的数据库的连接并在QTableView中显示表可以正常工作。通常使用QSqlTableModel本地支持编辑所有单元格。但是,当关联的默认ItemDelegate编辑单元格时,Qt似乎没有考虑数据库定义的任何约束。
假设我编辑一个外键值的单元格,不仅Qt让我输入任何键值,而且提交这些更改会查询数据库以执行更新。由于设定的限制,这显然不起作用。现在,我得到了一些问题可能有点过分,期望我的视图的默认ItemDelegate在编辑时检查有效值。
当我提交不受支持的值时,会出现真正的问题。视图仍然应用值更改,表明编辑有效。不会处理错误,也不会传递错误消息。从那里开始,视图将不允许对某些行进行编辑,直到我将更改恢复为符合我的约束的值。
我发现很难相信,我必须设置自己的itemDelegate,以验证数据库中约束的值更改。
由于我希望能够回答这篇文章的人知道如何设置连接,我会稍微制定代码:
bool driverSuccess = validDriver(driver);
if(driverSuccess) {
_db = QSqlDatabase::addDatabase(driver);
_db.setHostName(host);
_db.setDatabaseName(dbName);
_db.setPort(port);
_db.setUserName(user);
_db.setPassword(pwd);
_db.open();
//... validate connection
}
// setup table model and connect to view
QSqlRelationalTableModel* model = new QSqlRelationalTableModel;
model->setTable(tableName);
model->select()
QTableView* table_view = new QTableView(0);
table_view->setModel(model);
//...
_db.close()
我很感激任何帮助。谢谢!
答案 0 :(得分:1)
这是可以预料的。数据库驱动程序也不进行任何约束验证。数据库就是这样做的。您所能做的就是提交失败的查询。这也是Qt所做的一切。也许表模型可以通过恢复更改来对错误做出正确反应,而不是指示它们成功。我不确定是否存在影响Qt方面行为的设置/标志。
如果您希望了解可以预期的内容,请通过SQLPLUS文本客户端或类似实用程序手动执行查询。
现在,技术上可以让客户端从管理表中检索约束,然后以某种方式在UI上强制执行它们。你必须自己实现它,但是Qt并没有这样做。
如果您只对QSqlRelationalTableModel
中由于关系所固有的约束感兴趣,您可以在不编写其他查询的情况下强制执行这些约束 - 但代理人不知道任何事情关于他们。只有模型知道,并且模型没有标准机制将其公开给委托。您必须以自己的方式发明,并拥有一个可以处理它的自定义委托。