【问题标题】:QSqlRelationalDelegate in QSqlRelationalTableModel shows foreign key instead of its valueQSqlRelationalTableModel 中的 QSqlRelationalDelegate 显示外键而不是其值
【发布时间】:2021-09-27 13:29:21
【问题描述】:

这是我的代码:

QSqlRelationalTableModel *model = new QSqlRelationalTableModel(this, db1);
model->setTable("syllabi");
model->setRelation(3, QSqlRelation("activity_types", "activity_type_id", "activity_type_name"));
model->select();
ui->tableView->setModel(model);
ui->tableView->setItemDelegate(new QSqlRelationalDelegate(ui->tableView));

组合框中的值显示正确,但是当我更改值并选择表格的另一个单元格时,该单元格显示的是 ID(外键)而不是其值。 另外,当我使用此代码插入另一个值时

model->insertRow(model->rowCount());
model->setData(model->index(model->rowCount()-1, 0), teacherName);

有一个错误:

QODBCResult::exec: 无法执行语句:“[Microsoft][ODBC SQL Server Driver][SQL Server]将 nvarchar 值 'default' 转换为数据类型 int 时转换失败。”

表格没有正确连接?

编辑:

好的,现在当我更改组合框中的值时,它会删除整行。可能是什么原因?

表格:https://yadi.sk/i/ujL15zD_hupvz

【问题讨论】:

  • 底层组合框的源字段和源表是什么?如果该值正在消失,则表示组合框中没有与更改的值匹配的键。 ODBC 错误还告诉您将teacherName 作为nvarchar 而不是ID 字段插入。显示所有字段及其类型,以便我们准确调试。
  • @EmacsUser 对于我尝试连接的每个表都是一样的。现在是 activity_type 表。外键是activity_type_id,它被替换为带有activity_name 的组合框。必须有一个键,因为我从组合框中选择它,它就在那里!我尝试插入teacher_id 而不是teacher_name,它有效,谢谢!但是第一个问题仍然存在:我在一个单元格中看到activity_type_name,单击它,它显示一个组合框,我选择任何值,整行都消失了(它仍然存在但单元格是空的)
  • 我注意到,当我添加一个新行并更改其中的某些内容时,它不会立即被删除,只有当我填充所有单元格并将其发送到 db 时(不能在有空字段时发送到数据库),在此之前我无法访问表中的任何字段,只能访问最后一行。当我在组合框中选择值时,它们成为整数索引。在我填写所有字段后,所有行都被删除(尽管它已插入数据库)。好像我错过了一些非常明显的东西。

标签: c++ sql sql-server qt


【解决方案1】:

我知道现在已经很晚了,但无论如何,这就是答案。

我在 pyqt 中也遇到过同样的问题。问题在于EditStrategy.OnFieldChange 在插入新行时应该表现得像OnRowChange,但在编辑新行期间以某种方式不断跳过对关系的查找。将EditStrategy 更改为OnRowChange 即可解决问题。

这是我为我的问题得到的原始answer

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 2021-10-08
    • 2015-03-29
    • 2019-12-07
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2019-06-26
    • 2016-03-17
    相关资源
    最近更新 更多