このページでは

QSqlRelationalTableModel Class

QSqlRelationalTableModel クラスは、単一のデータベーステーブルに対して、外部キーをサポートした編集可能なデータモデルを提供します。詳細...

ヘッダー: #include <QSqlRelationalTableModel>
CMake: find_package(Qt6 REQUIRED COMPONENTS Sql)
target_link_libraries(mytarget PRIVATE Qt6::Sql)
qmake: QT += sql
継承元: QSqlTableModel

パブリック型

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::InnerJoin0- インナー結合モード。両方のテーブルに少なくとも1つの一致がある場合、行を返します。
QSqlRelationalTableModel::LeftJoin1- 左結合モード。右側のテーブル(table_name2)に一致する行がなくても、左側のテーブル(table_name1)のすべての行を返します。

関連項目: QSqlRelationalTableModel::setJoinMode()。

メンバー関数のドキュメント

[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 を返します。インデックスの代わりに QVariant() が渡された場合、インデックスはクリアされます。

editStrategy()、data()、submit()、およびrevertRow()も参照してください 。

void QSqlRelationalTableModel::setJoinMode(QSqlRelationalTableModel::JoinMode joinMode)

NULLの外部キーを持つ行を表示または非表示にするよう、SQLのjoinMode を設定します。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) を再実装します。

© 2026 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.