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