0

私はそれQMainWindowに2つQTableViewsあります。それぞれQTableViewに独自のがありQSqlRelationalTableModelます。私はOnManualSubmit両方のモデルの編集戦略として使用しています。両方のモデルが同じデータベースにヒットし、setTable(それぞれが異なるテーブルにヒットする)を使用してデータが入力され、その後に。が続きselect()ます。

setRelation2番目のテーブルのモデルは、最初のモデルの作成に使用されたテーブルにリンクするための適切な呼び出しで設定されます。2番目の(子)ビューで、私はview->setItemDelegate(new QSqlRelationalDelegate(view));

すべてがうまく機能しているようです。最初のビューに表示されるデータは、2番目のビューの適切なフィールドのドロップダウンに一覧表示されます。

私の問題:最初の(親)ビューにレコードを追加、編集、または削除してデータベースに保存する場合、ドロップダウンが正確になるように2番目のビューを更新するにはどうすればよいですか?

2番目の(子)ビューに未保存の編集がある可能性があり、それらを失いたくないし、まだ保存したくない。ドロップダウンリストを適切に更新したいだけです。

試しchild_model->relationModel(fk_col)->select();てみchild_model->relationModel(fk_col)->columnCount();ましたが、動作しますが、selectが親テーブルのすべてのフィールドで動作していることを示しています。これは、不必要な悲観化のようです。

これは私の最初の使用の試み<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 に答える