QTableView不刷新外键?

时间:2012-04-12 19:39:17

标签: c++ qt qtableview qt4.7 qsqltablemodel

我有一个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();表示select正在父表的所有字段上运行,这似乎是不必要的悲观化。

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

1 个答案:

答案 0 :(得分: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编辑器。
  • 在第一个模型发生更改时触发视图上映射列区域的重绘。