0

我有一个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所以我可能会遗漏一些基本的东西。也许有一种方法可以对两个视图使用相同的模型,并且刷新会自动发生?刷新子视图下拉菜单的适当方式是什么?

4

1 回答 1

0

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

例如,使用这个 db 结构:

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编辑器。
  • 每当第一个模型更改时,就会触发视图上映射列区域的重绘。
于 2012-04-13T13:26:27.037 回答