我已经实现了一个 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()
我会很感激任何帮助。谢谢!