QSqlRelationalTableModel Class

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

Header: #include <QSqlRelationalTableModel>
CMake: find_package(Qt6 REQUIRED COMPONENTS Sql)
target_link_libraries(mytarget PRIVATE Qt6::Sql)
qmake: QT += sql
Inherits: 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 を示しています。外部キー (citycountry) は人間が読める値には解決されません。右のスクリーンショットは 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 とマップされる外部キーであること、そしてビューがcityname フィールドをユーザに提示することを指定します。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 でなければならない。

QSqlRelationQSqlRelationalDelegate 、およびリレーショナル・テーブル・モデルの例も参照してください

メンバ型のドキュメント

enum QSqlRelationalTableModel::JoinMode

定数説明
QSqlRelationalTableModel::InnerJoin0- 内側joinモード、両方のテーブルに少なくとも1つのマッチがある場合に行を返します。
QSqlRelationalTableModel::LeftJoin1- 左結合モードでは、右のテーブル (テーブル名2) にマッチする行がなくても、左のテーブル (テーブル名1) からすべての行を返します。

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()

再リプルメント: (int row):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)

指定されたcolumnrelation で指定された外部インデックスとします。

    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).

©2024 The Qt Company Ltd. 本文書に含まれる文書の著作権は、それぞれの所有者に帰属します。 ここで提供されるドキュメントは、Free Software Foundationによって発行されたGNU Free Documentation License version 1.3の条項の下でライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。