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 |
- 継承メンバを含む全メンバのリスト
- 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()
再リプルメント: (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)
指定された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).
©2024 The Qt Company Ltd. 本文書に含まれる文書の著作権は、それぞれの所有者に帰属します。 ここで提供されるドキュメントは、Free Software Foundationによって発行されたGNU Free Documentation License version 1.3の条項の下でライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。