QSqlTableModel with QTableView - 考虑数据库定义的编辑约束
QSqlTableModel with QTableView - consider DB defined constraint on edit
我已经实现了 Oracle 数据库。我将 Qt 用于我的应用程序的 GUI 和数据库的界面。设置与我的数据库的连接并在 QTableView 中显示表格工作正常。使用 QSqlTableModel 通常原生支持编辑所有单元格。然而,当关联的默认 ItemDelegate 编辑单元格时,Qt 似乎没有考虑数据库定义的任何约束。
假设我编辑了一个外键值的单元格,Qt 不仅让我输入 none 键值,而且提交这些更改会查询数据库以执行更新。由于设定的限制,这显然行不通。现在,我知道要求我的视图的默认 ItemDelegate 在编辑时检查有效值可能有点太多了。
当我提交一个不受支持的值时,真正的问题出现了。视图仍然应用值更改,表明编辑有效。不处理任何错误,也不传递错误消息。从那里开始,视图将不允许对某些行进行编辑,直到我将更改恢复为符合我的约束的值。
我很难相信,我必须设置自己的 itemDelegate,以根据数据库中的约束验证值更改。
因为我希望能够回答这个问题的人 post 知道如何建立连接,所以我会稍微简化一下代码:
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()
如果有任何帮助,我将不胜感激。谢谢!
这是意料之中的事情。数据库驱动程序也不进行任何约束验证。数据库就是这样做的。您所能做的就是提交一个失败的查询。这也是 Qt 所做的一切。或许 table 模型可以通过还原更改来对错误做出正确的反应,而不是指示它们已成功。我不确定是否有 setting/flag 会影响 Qt 方面的行为。
如果您想了解预期结果,请通过 SQLPLUS 文本客户端或类似实用程序手动进行查询。
现在 技术上 客户端可以从管理 table 检索约束,然后以某种方式在 UI 上强制执行它们。不过,您必须自己实现它 - Qt 不会这样做。
如果您只对 QSqlRelationalTableModel
中的关系所固有的约束感兴趣,您可以在不编写额外查询的情况下强制执行它们 - 但代理不知道 任何东西 关于他们。只有模型知道,模型没有标准机制将其公开给委托。您必须发明自己的方式,并有一个可以处理它的自定义委托。
我已经实现了 Oracle 数据库。我将 Qt 用于我的应用程序的 GUI 和数据库的界面。设置与我的数据库的连接并在 QTableView 中显示表格工作正常。使用 QSqlTableModel 通常原生支持编辑所有单元格。然而,当关联的默认 ItemDelegate 编辑单元格时,Qt 似乎没有考虑数据库定义的任何约束。
假设我编辑了一个外键值的单元格,Qt 不仅让我输入 none 键值,而且提交这些更改会查询数据库以执行更新。由于设定的限制,这显然行不通。现在,我知道要求我的视图的默认 ItemDelegate 在编辑时检查有效值可能有点太多了。
当我提交一个不受支持的值时,真正的问题出现了。视图仍然应用值更改,表明编辑有效。不处理任何错误,也不传递错误消息。从那里开始,视图将不允许对某些行进行编辑,直到我将更改恢复为符合我的约束的值。
我很难相信,我必须设置自己的 itemDelegate,以根据数据库中的约束验证值更改。
因为我希望能够回答这个问题的人 post 知道如何建立连接,所以我会稍微简化一下代码:
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()
如果有任何帮助,我将不胜感激。谢谢!
这是意料之中的事情。数据库驱动程序也不进行任何约束验证。数据库就是这样做的。您所能做的就是提交一个失败的查询。这也是 Qt 所做的一切。或许 table 模型可以通过还原更改来对错误做出正确的反应,而不是指示它们已成功。我不确定是否有 setting/flag 会影响 Qt 方面的行为。
如果您想了解预期结果,请通过 SQLPLUS 文本客户端或类似实用程序手动进行查询。
现在 技术上 客户端可以从管理 table 检索约束,然后以某种方式在 UI 上强制执行它们。不过,您必须自己实现它 - Qt 不会这样做。
如果您只对 QSqlRelationalTableModel
中的关系所固有的约束感兴趣,您可以在不编写额外查询的情况下强制执行它们 - 但代理不知道 任何东西 关于他们。只有模型知道,模型没有标准机制将其公开给委托。您必须发明自己的方式,并有一个可以处理它的自定义委托。