带QTableView的QSqlTableModel - 考虑编辑时DB定义的约束

时间:2015-08-12 17:56:27

标签: database oracle qt qitemdelegate qsqltablemodel

我已经实现了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()

我很感激任何帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

这是可以预料的。数据库驱动程序也不进行任何约束验证。数据库就是这样做的。您所能做的就是提交失败的查询。这也是Qt所做的一切。也许表模型可以通过恢复更改来对错误做出正确反应,而不是指示它们成功。我不确定是否存在影响Qt方面行为的设置/标志。

如果您希望了解可以预期的内容,请通过SQLPLUS文本客户端或类似实用程序手动执行查询。

现在,技术上可以让客户端从管理表中检索约束,然后以某种方式在UI上强制执行它们。你必须自己实现它,但是Qt并没有这样做。

如果您只对QSqlRelationalTableModel中由于关系所固有的约束感兴趣,您可以在不编写其他查询的情况下强制执行这些约束 - 但代理人不知道任何事情