QSqlRelationalTableModel Class
QSqlRelationalTableModel クラスは、外部キーをサポートした単一のデータベーステーブル用の編集可能なデータモデルを提供します。詳細...
ヘッダ | #include <QSqlRelationalTableModel> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Sql) target_link_libraries(mytarget PRIVATE Qt6::Sql) |
qmake: | QT += sql |
継承: | QSqlTableModel |
- 継承されたメンバを含むすべてのメンバのリスト
- QSqlRelationalTableModel はデータベースクラスの一部です。
パブリックタイプ
enum | JoinMode { InnerJoin, LeftJoin } |
パブリック関数
QSqlRelationalTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase()) | |
virtual | ~QSqlRelationalTableModel() |
QSqlRelation | relation(int column) const |
virtual QSqlTableModel * | relationModel(int column) const |
void | setJoinMode(QSqlRelationalTableModel::JoinMode joinMode) |
virtual void | setRelation(int column, const QSqlRelation &relation) |
再実装パブリック関数
virtual void | clear() override |
virtual QVariant | data(const QModelIndex &index, int role = Qt::DisplayRole) const override |
virtual bool | removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override |
virtual bool | select() override |
virtual bool | setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override |
virtual void | setTable(const QString &table) override |
パブリックスロット
virtual void | revertRow(int row) override |
再実装された保護された関数
virtual bool | insertRowIntoTable(const QSqlRecord &values) override |
virtual QString | orderByClause() const override |
virtual QString | selectStatement() const override |
virtual bool | updateRowInTable(int row, const QSqlRecord &values) override |
詳細説明
QSqlRelationalTableModel はQSqlTableModel のように動作しますが、カラムを他のデータベーステーブルの外部キーとして設定することができます。
![]() | ![]() |
左のスクリーンショットは、QTableView 内のプレーンなQSqlTableModel を示しています。外部キー (city
とcountry
) は人間が読める値には解決されません。右のスクリーンショットは QSqlRelationalTableModel を示しており、外部キーは人間が読めるテキスト文字列に解決されています。
次のコード スニペットは、QSqlRelationalTableModel がどのようにセットアップされたかを示しています:
model->setTable("employee"); model->setRelation(2, QSqlRelation("city", "id", "name")); model->setRelation(3, QSqlRelation("country", "id", "name"));
setRelation() 関数の呼び出しは、2 つのテーブル間のリレーションシップを確立します。最初の呼び出しは、テーブルemployee
のカラム 2 がテーブルcity
のフィールドid
とマップされる外部キーであること、そしてビューがcity
のname
フィールドをユーザに提示することを指定します。2番目の呼び出しは、列3に対して同様のことを行います。
読み書き可能な QSqlRelationalTableModel を使用する場合、おそらくビューでQSqlRelationalDelegate を使用したいでしょう。デフォルトのデリゲートとは異なり、QSqlRelationalDelegate は他のテーブルへの外部キーであるフィールドのコンボボックスを提供します。このクラスを使用するには、QSqlRelationalDelegate のインスタンスを使用してQAbstractItemView::setItemDelegate() を呼び出します:
std::unique_ptr<QTableView> view{new QTableView}; view->setModel(model); view->setItemDelegate(new QSqlRelationalDelegate(view.get()));
relationaltablemodel の例では、QSqlRelationalTableModel をQSqlRelationalDelegate と組み合わせて使用し、外部キーをサポートするテーブルを提供する方法を説明しています。
注意事項
- テーブルには主キーが宣言されていなければなりません。
- テーブルの主キーは、他のテーブルとのリレーションを含むことはできません。
- リレーショナルテーブルに、参照先のテーブルに存在しない行を参照するキーが含まれている場合、その無効なキーを含む行はモデルを通して公開されません。参照整合性を保つ責任は、ユーザもしくはデータベースにあります。
- リレーションの表示カラム名がリレーショナルテーブルのカラム名としても使用されている場合、あるいは複数のリレーションで表示カラム名として使用されている場合、エイリアスが付けられます。エイリアスは、リレーションのテーブル名、表示カラム名、一意な ID をアンダースコアでつなげたものです (例: tablename_columnname_id)。QSqlRecord::fieldName() はエイリアスされたカラム名を返します。重複が検出されると、表示カラム名の重複はすべてエイリアシングされますが、メインテーブルのカラム名にはエイリアシングは行われません。エイリアシングはQSqlRelation には影響しないので、QSqlRelation::displayColumn() は元の表示列名を返します。
- 参照テーブル名はエイリアスされる。エイリアスは、"relTblAl "という単語と、アンダースコア(例えば、relTblAl_2)で結合されたリレーションカラムのインデックスです。このエイリアスを使用して、テーブルをフィルタリングすることができます(例えば、setFilter("relTblAl_2='Oslo' OR relTblAl_3='USA'"))。
- setData() を使用する場合、ロールは常にQt::EditRole でなければならず、data() を使用する場合、ロールは常にQt::DisplayRole でなければならない。
QSqlRelation 、QSqlRelationalDelegate 、およびリレーショナル・テーブル・モデルの例も参照してください 。
メンバ型のドキュメント
enum QSqlRelationalTableModel::JoinMode
定数 | 値 | 説明 |
---|---|---|
QSqlRelationalTableModel::InnerJoin | 0 | - 内側joinモードでは、両方のテーブルに少なくとも1つのマッチがある場合に行を返します。 |
QSqlRelationalTableModel::LeftJoin | 1 | - 左結合モードでは、右のテーブル(テーブル名2)にマッチするものがなくても、左のテーブル(テーブル名1)からすべての行を返します。 |
メンバ関数のドキュメント
[explicit]
QSqlRelationalTableModel::QSqlRelationalTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase())
空の QSqlRelationalTableModel を作成し、親をparent に、データベース接続をdb に設定します。db が有効でない場合、デフォルトのデータベース接続が使用されます。
[virtual noexcept]
QSqlRelationalTableModel::~QSqlRelationalTableModel()
オブジェクトを破棄し、割り当てられたリソースを解放する。
[override virtual]
void QSqlRelationalTableModel::clear()
再インプリメント:QSqlTableModel::clear().
[override virtual]
QVariant QSqlRelationalTableModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
再実装:QSqlTableModel::data(const QModelIndex &index, int role) const.
setData()も参照してください 。
[override virtual protected]
bool QSqlRelationalTableModel::insertRowIntoTable(const QSqlRecord &values)
再インプリメント:QSqlTableModel::insertRowIntoTable(const QSqlRecord &values).
[override virtual protected]
QString QSqlRelationalTableModel::orderByClause() const
再実装:QSqlTableModel::orderByClause() const.
QSqlRelation QSqlRelationalTableModel::relation(int column) const
columnリレーションが設定されていない場合は無効なリレーションを返します。
setRelation() およびQSqlRelation::isValid()も参照 。
[virtual]
QSqlTableModel *QSqlRelationalTableModel::relationModel(int column) const
column が外部キーであるテーブルにアクセスするためのQSqlTableModel オブジェクトを返します。与えられたcolumn に対してリレーションがない場合はnullptr
を返します。
返されたオブジェクトはQSqlRelationalTableModel が所有します。
setRelation() およびrelation()も参照 。
[override virtual]
bool QSqlRelationalTableModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())
再実装:QSqlTableModel::removeColumns(int column, int count, const QModelIndex &parent).
[override virtual slot]
void QSqlRelationalTableModel::revertRow(int row)
再インプリメント:QSqlTableModel::revertRow(int row).
[override virtual]
bool QSqlRelationalTableModel::select()
再インプリメント:QSqlTableModel::select().
[override virtual protected]
QString QSqlRelationalTableModel::selectStatement() const
再実装:QSqlTableModel::selectStatement() const.
[override virtual]
bool QSqlRelationalTableModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
再実装:QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role)。
指定されたindex を持つアイテムのrole のデータを、指定されたvalue に設定します。編集ストラテジーに応じて、値は一度にデータベースに適用されるかもしれませんし、モデルにキャッシュされるかもしれません。
値を設定できた場合はtrue
、エラー時にはfalseを返します(例えば、index が範囲外の場合など)。
リレーショナルカラムの場合、value は表示値ではなくインデックスでなければなりません。インデックスも参照されるテーブルに存在しなければなりません。そうでない場合、この関数はfalse
を返します。
editStrategy()、data()、submit()、revertRow()も参照のこと 。
void QSqlRelationalTableModel::setJoinMode(QSqlRelationalTableModel::JoinMode joinMode)
NULL 外部キーを持つ行の表示/非表示を SQLjoinMode で設定します。InnerJoin モード(デフォルト)では、これらの行は表示されません。表示したい場合はLeftJoin モードを使用してください。
QSqlRelationalTableModel::JoinModeも参照してください 。
[virtual]
void QSqlRelationalTableModel::setRelation(int column, const QSqlRelation &relation)
指定されたcolumn をrelation で指定された外部インデックスとします。
例:
model->setTable("employee"); model->setRelation(2, QSqlRelation("city", "id", "name"));
setRelation() の呼び出しは、テーブルemployee
の列 2 が、テーブルcity
のフィールドid
とマップされる外部キーであり、ビューがcity
のフィールドname
をユーザに提示する必要があることを指定します。
注意: テーブルの主キーは、他のテーブルとのリレーションを含むことはできません。
relation()も参照してください 。
[override virtual]
void QSqlRelationalTableModel::setTable(const QString &table)
再実装:QSqlTableModel::setTable(const QString &tableName).
[override virtual protected]
bool QSqlRelationalTableModel::updateRowInTable(int row, const QSqlRecord &values)
再インプリメント:QSqlTableModel::updateRowInTable(int row, const QSqlRecord &values).
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.