1

我已经实现了一个 Oracle 数据库。我将 Qt 用于我的应用程序的 GUI 并作为数据库的接口。建立与我的数据库的连接并在 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()

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

4

1 回答 1

1

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

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

现在,从技术上讲,客户端可以从管理表中检索约束,然后以某种方式在 UI 上强制执行它们。不过,您必须自己实现它——Qt 不这样做。

如果您只对由于 中的关系而固有的约束感兴趣QSqlRelationalTableModel,您可以在不编写额外查询的情况下强制执行它们 - 但委托对它们一无所知。只有模型知道,并且模型没有标准机制将其公开给委托。您必须发明自己的方式,并拥有可以处理它的自定义委托。

于 2015-08-12T21:05:18.347 回答