QTableView 不刷新外键

QTableView does not refresh foreign keys?

本文关键字:刷新 QTableView      更新时间:2023-10-16

我有一个QMainWindow,上面有两个QTableViews。 每个QTableView都有自己的QSqlRelationalTableModel。 我使用 OnManualSubmit 作为两种模型的编辑策略。 两个模型都命中同一个数据库,并使用setTable填充(每个模型命中不同的表),后跟 select()

第二个表的模型设置了适当的调用,以setRelation将其链接到用于填充第一个模型的表。 关于第二种(儿童)观点,我称之为view->setItemDelegate(new QSqlRelationalDelegate(view));

一切似乎都很好:第一个视图中显示的数据列在第二个视图相应字段的下拉列表中。

我的问题:当我在第一个(父)视图添加、编辑或删除记录并将其保存到数据库时,我应该如何刷新第二个视图以使下拉列表准确?

第二个(子)视图中可能存在未保存的编辑内容,我不想丢失这些编辑内容,也不想保存它们。 我只想适当地更新下拉列表。

我尝试了child_model->relationModel(fk_col)->select();并且有效,但child_model->relationModel(fk_col)->columnCount();表明选择正在父表的所有字段上运行,这似乎是不必要的悲观。

这是我第一次尝试使用<QtSql>QTableView,所以我可能错过了一些基本的东西。 也许有一种方法可以对两个视图使用相同的模型,并且刷新会自动发生? 刷新子视图下拉列表的适当方法是什么?

QSqlRelationalTableModel执行的查询不再包含外键。

例如,使用此数据库结构:

CREATE TABLE countries (id, name);
CREATE TABLE cities(id, name, id_country);

查询将如下所示:

SELECT id, name, country_name FROM cities 
    LEFT JOIN countries ON id_country = countries.id;

这意味着,如果联接的表发生更改,则必须重新执行查询才能更新表。

要自动刷新,我想你会有:

  • 使用常规QSqlTableModel将实际外键保留在模型中,
  • 编写 QAbstractItemDelegate 类以显示映射值并创建QComboBox编辑器。
  • 以在第一个模型更改时触发视图上映射列区域的重绘。