QSqlTableModel Class

QSqlTableModel クラスは、単一のデータベーステーブルに対して編集可能なデータモデルを提供します。詳細...

Header: #include <QSqlTableModel>
CMake: find_package(Qt6 REQUIRED COMPONENTS Sql)
target_link_libraries(mytarget PRIVATE Qt6::Sql)
qmake: QT += sql
Inherits: QSqlQueryModel
Inherited By:

QSqlRelationalTableModel

パブリック型

enum EditStrategy { OnFieldChange, OnRowChange, OnManualSubmit }

パブリック関数

QSqlTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase())
virtual ~QSqlTableModel()
QSqlDatabase database() const
QSqlTableModel::EditStrategy editStrategy() const
int fieldIndex(const QString &fieldName) const
QString filter() const
bool insertRecord(int row, const QSqlRecord &record)
bool isDirty(const QModelIndex &index) const
bool isDirty() const
QSqlIndex primaryKey() const
QSqlRecord record() const
QSqlRecord record(int row) const
virtual void revertRow(int row)
virtual void setEditStrategy(QSqlTableModel::EditStrategy strategy)
virtual void setFilter(const QString &filter)
bool setRecord(int row, const QSqlRecord &values)
virtual void setSort(int column, Qt::SortOrder order)
virtual void setTable(const QString &tableName)
QString tableName() const

再実装パブリック関数

virtual void clear() override
virtual bool clearItemData(const QModelIndex &index) override
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override
virtual Qt::ItemFlags flags(const QModelIndex &index) const override
virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override
virtual bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override
virtual bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override
virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override
virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override
virtual void sort(int column, Qt::SortOrder order) override

パブリックスロット

virtual void revert() override
void revertAll()
virtual bool select()
virtual bool selectRow(int row)
virtual bool submit() override
bool submitAll()

シグナル

void beforeDelete(int row)
void beforeInsert(QSqlRecord &record)
void beforeUpdate(int row, QSqlRecord &record)
void primeInsert(int row, QSqlRecord &record)

保護された関数

virtual bool deleteRowFromTable(int row)
virtual bool insertRowIntoTable(const QSqlRecord &values)
virtual QString orderByClause() const
QSqlRecord primaryValues(int row) const
virtual QString selectStatement() const
void setPrimaryKey(const QSqlIndex &key)
virtual bool updateRowInTable(int row, const QSqlRecord &values)

再実装された保護された関数

virtual QModelIndex indexInQuery(const QModelIndex &item) const override

詳細説明

QSqlTableModel は、単一のテーブルからデータベースレコードを読み書きするための高レベルインターフェースです。これは、低レベルのQSqlQuery の上に構築され、QTableView のようなビュークラスにデータを提供するために使用することができます。例えば

    QSqlTableModel *model = new QSqlTableModel;
    model->setTable("employee");
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->select();
    model->setHeaderData(0, Qt::Horizontal, tr("Name"));
    model->setHeaderData(1, Qt::Horizontal, tr("Salary"));

    QTableView *view = new QTableView;
    view->setModel(model);
    view->hideColumn(0); // don't show the ID
    view->show();

SQLテーブルの名前と編集ストラテジーを設定し、ビューのヘッダーに表示されるラベルを設定します。editストラテジーは、ユーザーがビューで行った変更が実際にデータベースに適用されるタイミングを決定します。設定可能な値はOnFieldChangeOnRowChange 、およびOnManualSubmit です。

QSqlTableModel は、ビューにバインドすることなく、プログラムでデータベースにアクセスするために使用することもできます:

    QSqlTableModel model;
    model.setTable("employee");
    model.select();
    int salary = model.record(4).value("salary").toInt();

上記のコード・スニペットは、クエリSELECT * from employee の結果セットのレコード 4 からsalary フィールドを抽出しています。

setFilter() を使ってフィルタを設定したり、setSort() を使ってソート順を変更したりすることができます。最後に、select() を呼び出して、モデルにデータを入力する必要があります。

tablemodel の例では、QTableView のデータソースとして QSqlTableModel を使用する方法を説明しています。

QSqlTableModel は外部キーを直接サポートしていません。外部キーを解決したい場合は、QSqlRelationalTableModel およびQSqlRelationalDelegate を使用してください。

QSqlRelationalTableModelQSqlQueryモデル/ビュー・プログラミングテーブル・モデルの例、およびキャッシュ SQL テーブルも参照してください

メンバ型のドキュメント

enum QSqlTableModel::EditStrategy

この列挙型は、データベース内の値を編集する際にどのストラテジーを選択するかを記述します。

定数説明
QSqlTableModel::OnFieldChange0モデルへのすべての変更は、即座にデータベースに適用されます。
QSqlTableModel::OnRowChange1行への変更は、ユーザが別の行を選択したときに適用されます。
QSqlTableModel::OnManualSubmit2すべての変更は、submitAll() またはrevertAll() が呼び出されるまで、モデルにキャッシュされます。

注意: 初期化された行の一部のみがデータベースに挿入されるのを防ぐため、OnFieldChange は、新しく挿入された行に対してOnRowChange のように動作します。

setEditStrategy()も参照してください

メンバ関数ドキュメント

[explicit] QSqlTableModel::QSqlTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase())

空の QSqlTableModel を作成し、親をparent に、データベース接続をdb に設定します。db が有効でない場合、デフォルトのデータベース接続が使用されます。

デフォルトの編集ストラテジはOnRowChange です。

[virtual noexcept] QSqlTableModel::~QSqlTableModel()

オブジェクトを破棄し、割り当てられたリソースを解放します。

[signal] void QSqlTableModel::beforeDelete(int row)

このシグナルは、現在アクティブなデータベース・テーブルからrow が削除される前にdeleteRowFromTable() から発行されます。

[signal] void QSqlTableModel::beforeInsert(QSqlRecord &record)

このシグナルは、現在アクティブなデータベース・テーブルに新しい行が挿入される前に、insertRowIntoTable() によって発せられる。挿入されようとしている値はrecord に格納され、挿入される前に変更することができる。

[signal] void QSqlTableModel::beforeUpdate(int row, QSqlRecord &record)

このシグナルは、現在アクティブなデータベース・テーブルのrowrecord からの値で更新される前に、updateRowInTable()によって発せられる。

生成されたとマークされた値のみが更新されることに注意。生成済みフラグはQSqlRecord::setGenerated() で設定でき、QSqlRecord::isGenerated() でチェックできる。

QSqlRecord::isGenerated()も参照してください

[override virtual] void QSqlTableModel::clear()

再インプリメント:QSqlQueryModel::clear().

[override virtual] bool QSqlTableModel::clearItemData(const QModelIndex &index)

再リプリメント:QAbstractItemModel::clearItemData(const QModelIndex &index)。

[override virtual] QVariant QSqlTableModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const

再リンプルメント:QSqlQueryModel::data(const QModelIndex &item, int role) const.

setData()も参照してください

QSqlDatabase QSqlTableModel::database() const

モデルのデータベース接続を返します。

[virtual protected] bool QSqlTableModel::deleteRowFromTable(int row)

現在アクティブなデータベース・テーブルから指定されたrow を削除します。

これはデータベースを直接操作する低レベルのメソッドであり、直接呼び出すべきではありません。値を削除するにはremoveRow() またはremoveRows() を使用してください。モデルはデータベースを修正するタイミングを編集戦略によって決定します。

行が削除された場合はtrue を返し、そうでない場合はfalse を返します。

removeRow() およびremoveRows()も参照して ください。

QSqlTableModel::EditStrategy QSqlTableModel::editStrategy() const

現在の編集ストラテジを返します。

setEditStrategy() も参照して ください。

int QSqlTableModel::fieldIndex(const QString &fieldName) const

フィールドfieldName のインデックスを返します。対応するフィールドがモデルに存在しない場合は -1 を返します。

QString QSqlTableModel::filter() const

現在設定されているフィルタを返します。

setFilter() およびselect()も参照して ください。

[override virtual] Qt::ItemFlags QSqlTableModel::flags(const QModelIndex &index) const

再実装:QAbstractTableModel::flags(const QModelIndex &index) const.

[override virtual] QVariant QSqlTableModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const

再実装:QSqlQueryModel::headerData(int section, Qt::Orientation orientation, int role) const.

[override virtual protected] QModelIndex QSqlTableModel::indexInQuery(const QModelIndex &item) const

再実装:QSqlQueryModel::indexInQuery(const QModelIndex &item) const.

モデル内の指定されたitem のデータベース結果セット内の値のインデックスを返します。

列や行が挿入、削除、移動されていない場合、戻り値はitem と同じです。

item が範囲外であるか、item が結果セット内の値を指していない場合、無効なモデルインデックスを返します。

QSqlQueryModel::indexInQuery()も参照のこと

bool QSqlTableModel::insertRecord(int row, const QSqlRecord &record)

row の位置にrecord を挿入する。row が負の場合、レコードは最後に追加される。insertRows() およびsetRecord() を内部的に呼び出します。

レコードを挿入できた場合はtrue を返し、そうでない場合は false を返す。

OnFieldChange およびOnRowChange の場合、変更は即座に送信される。失敗してもモデルに新しい行は残りません。

insertRows()、removeRows()、setRecord()も参照して ください。

[virtual protected] bool QSqlTableModel::insertRowIntoTable(const QSqlRecord &values)

現在アクティブなデータベース・テーブルに値values を挿入します。

これは、データベースを直接操作する低レベルのメソッドであり、直接呼び出すべきではありません。値を挿入するには、insertRow() およびsetData() を使用します。モデルはデータベースを修正するタイミングを編集戦略によって決定します。

値を挿入できた場合はtrue を返し、そうでない場合は false を返します。エラー情報はlastError() で取得できます。

lastError(),insertRow(),insertRows()も参照ください

[override virtual] bool QSqlTableModel::insertRows(int row, int count, const QModelIndex &parent = QModelIndex())

再実装:QAbstractItemModel::insertRows(int row, int count, const QModelIndex &parent).

row の位置にcount の空の行を挿入します。このモデルは親子関係をサポートしていないため、parent は無効でなければならないことに注意してください。

編集ストラテジーOnFieldChangeOnRowChange については、一度に挿入できる行は1行のみであり、モデルには他のキャッシュされた変更を含めることはできません。

primeInsert() シグナルは新しい行ごとに発行されます。新しい行をデフォルト値で初期化したい場合は、このシグナルに接続してください。

編集ストラテジーに関係なく、行を投稿しません。

パラメータが範囲外であるか、行を挿入できない場合はfalse を返し、そうでない場合はtrue を返します。

primeInsert() およびinsertRecord()も参照のこと

bool QSqlTableModel::isDirty(const QModelIndex &index) const

インデックスindex の値がダーティな場合はtrue を返し、そうでない場合は false を返します。ダーティな値とは、モデル内で変更されたが、まだデータベースに書き込まれていない値のことです。

index が無効であるか、存在しない行を指している場合、false が返されます。

bool QSqlTableModel::isDirty() const

これはオーバーロードされた関数です。

モデルにデータベースにコミットされていない変更された値が含まれている場合はtrue を返し、そうでない場合は false を返します。

[virtual protected] QString QSqlTableModel::orderByClause() const

現在設定されているソート順に基づいて SQLORDER BY 節を返します。

setSort() およびselectStatement()も参照してください

QSqlIndex QSqlTableModel::primaryKey() const

現在のテーブルの主キーを返します。テーブルが設定されていないか主キーがない場合は空のQSqlIndex を返します。

setTable()、setPrimaryKey() およびQSqlDatabase::primaryIndex() も参照

[protected] QSqlRecord QSqlTableModel::primaryValues(int row) const

row の値に設定された主キーで表されるフィールドを含むレコードを返します。主キーが定義されていない場合、返されるレコードにはすべてのフィールドが含まれます。

primaryKey()も参照

[signal] void QSqlTableModel::primeInsert(int row, QSqlRecord &record)

このシグナルは、現在アクティブなデータベース・テーブルの指定されたrow に挿入が開始されると、insertRows() から発行されます。record パラメータは (参照なので) 書き込むことができます。たとえば、いくつかのフィールドにデフォルト値を入力したり、フィールドの生成フラグを設定したりすることができます。このシグナルの処理中に、setData() やsetRecord() などの他の手段でレコードを編集しようとしないでください。

QSqlRecord QSqlTableModel::record() const

これはオーバーロードされた関数である。

フィールド名だけを持つ空のレコードを返します。この関数は、レコードのフィールド名を取得するために使用できます。

setRecord() およびQSqlRecord::isEmpty()も参照のこと

QSqlRecord QSqlTableModel::record(int row) const

モデル内のrow にあるレコードを返します。

row が有効な行のインデックスである場合、レコードにはその行の値が代入されます。

モデルが初期化されていない場合は、空のレコードが返されます。

QSqlRecord::isEmpty()も参照してください

[override virtual] bool QSqlTableModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())

再インプリメント:QSqlQueryModel::removeColumns(int column, int count, const QModelIndex &parent).

parent モデルからcolumn インデックスから始まるcount 列を削除します。

カラムが正常に削除された場合に返されます。そうでない場合はfalse を返します。

removeRows()も参照してください

[override virtual] bool QSqlTableModel::removeRows(int row, int count, const QModelIndex &parent = QModelIndex())

再実装:QAbstractItemModel::removeRows(int row, int count, const QModelIndex &parent).

row から始まるcount 行を削除します。このモデルは階層構造をサポートしていないため、parent は無効なモデル・インデックスでなければなりません。

編集ストラテジーがOnManualSubmit の場合、データベースからの行の削除はsubmitAll() が呼び出されるまで延期されます。

OnFieldChangeOnRowChange の場合、一度に削除できる行は1行のみであり、他の行にキャッシュされた変更がない場合にのみ削除されます。削除は即座にデータベースに送信されます。モデルは、select()でリフレッシュされるまで、削除に成功した行の空行を保持します。

削除に失敗した後、その操作はモデル内で元に戻されません。アプリケーションは再送信または差し戻しを行うことができます。

削除される範囲に挿入されたがまだ正常に送信されていない行は、直ちにモデルから削除されます。

行がデータベースから削除される前に、beforeDelete ()シグナルが発行されます。

row < 0 または row + count >rowCount() の場合、何も行われず false が返されます。すべての行を削除できた場合はtrue を返し、そうでない場合はfalse を返します。詳細なデータベース・エラー情報は、lastError() を使用して取得できます。

removeColumns() およびinsertRows()も参照 ください。

[override virtual slot] void QSqlTableModel::revert()

を参照してください:QAbstractItemModel::revert().

この再実装されたスロットは、ユーザが現在の行の編集をキャンセルしたときにアイテムデリゲートによって呼び出されます。

モデルのストラテジーがOnRowChange またはOnFieldChange に設定されている場合、変更を元に戻します。OnManualSubmit ストラテジーの場合は何もしません。

OnManualSubmit ストラテジーの保留中の変更をすべて戻すにはrevertAll() を使用し、特定の行を戻すにはrevertRow() を使用します。

submit()、submitAll()、revertRow() およびrevertAll()も参照

[slot] void QSqlTableModel::revertAll()

保留中の変更をすべて取り消します。

revert()、revertRow()、submitAll() も参照

[virtual] void QSqlTableModel::revertRow(int row)

指定したrow のすべての変更を取り消します。

revert()、revertAll()、submit()、submitAll()も参照

[override virtual] int QSqlTableModel::rowCount(const QModelIndex &parent = QModelIndex()) const

再実装:QSqlQueryModel::rowCount(const QModelIndex &parent) const.

[virtual slot] bool QSqlTableModel::select()

false指定されたフィルタとソート条件を使用して、setTable() によって設定されたテーブルからデータをモデルに入力し、成功した場合はtrue を返します。

注意: select() を呼び出すと、未提出の変更はすべて戻され、挿入された列はすべて削除されます。

setTable()、setFilter()、selectStatement()も参照して ください。

[virtual slot] bool QSqlTableModel::selectRow(int row)

モデル内のrow を、主キーの値にマッチするデータベーステーブルの行の値でリフレッシュします。主キーがない場合は、すべての列の値が一致しなければなりません。一致する行が見つからない場合、モデルは空の行を表示します。

成功した場合はtrue を返し、そうでない場合はfalse を返します。

select()も参照してください

[virtual protected] QString QSqlTableModel::selectStatement() const

モデルの入力に内部的に使用される SQLSELECT 文を返します。この文には、フィルタとORDER BY 節が含まれます。

filter() およびorderByClause() も参照して ください。

[override virtual] bool QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)

再実装:QAbstractItemModel::setData(const QModelIndex &index, const QVariant &value, int role)。

role の項目index のデータをvalue に設定します。

編集ストラテジーOnFieldChange については、インデックスが変更を受け取ることができるのは、他のインデックスに変更がキャッシュされていない場合のみです。変更は即座に提出されます。しかし、まだデータベースに挿入されていない行は自由に変更することができ、自動的に提出されることはありません。提出された変更は、失敗しても戻されません。

OnRowChange の場合、インデックスが変更を受け取ることができるのは、他の行に変更がキャッシュされていない場合のみです。変更は自動的に提出されません。

value が現在の値と等しい場合、true を返します。しかし、この値はデータベースには送信されません。

値が設定される可能性がある場合はtrue を返し、index が範囲外の場合などのエラー時には false を返します。

ロールがQt::EditRole でない場合はfalse を返します。EditRole以外のロールのデータを設定するには、カスタムプロキシモデルを使用するか、QSqlTableModel のサブクラスを使用してください。

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

[virtual] void QSqlTableModel::setEditStrategy(QSqlTableModel::EditStrategy strategy)

データベース内の値を編集する際のストラテジをstrategy に設定します。

これにより、保留中の変更がすべて戻されます。

editStrategy() およびrevertAll()も参照して ください。

[virtual] void QSqlTableModel::setFilter(const QString &filter)

現在のフィルタをfilter に設定します。

フィルタは、キーワードWHERE を除いた SQLWHERE 節です (例えば、name='Josephine').

モデルにデータベースからのデータが既に入力されている場合、モデルは新しいフィルタでデータを再選択します。そうでない場合は、次にselect() が呼び出されたときにフィルタが適用されます。

filter(),select(),selectStatement(),orderByClause()も参照してください

[protected] void QSqlTableModel::setPrimaryKey(const QSqlIndex &key)

サブクラスが主キーをkey に設定できるようにするプロテクト・メソッド。

通常、主インデックスはsetTable() をコールするたびに自動的に設定されます。

primaryKey() およびQSqlDatabase::primaryIndex()も参照して ください。

bool QSqlTableModel::setRecord(int row, const QSqlRecord &values)

values をモデル内のrow に適用します。ソース・フィールドとターゲット・フィールドは、レコード内の位置ではなく、フィールド名でマッピングされます。

values で生成されたフラグは、変更がデータベースにサブミットされるときに対応するフィールドが使用されるかどうかを決定するために保持されることに注意してください。デフォルトでは、QSqlRecord のすべてのフィールドに対してtrue に設定されています。values のすべての値に対してsetGenerated (false)を使用して、false にフラグを設定する必要があります。

編集ストラテジOnFieldChange およびOnRowChange では、他の行にキャッシュされた変更がない場合にのみ、行は変更を受け取ることができます。変更は即座に提出されます。提出された変更は、失敗しても戻されません。

すべての値を設定できた場合はtrue を返し、そうでない場合は false を返します。

record() およびeditStrategy()も参照

[virtual] void QSqlTableModel::setSort(int column, Qt::SortOrder order)

column のソート順をorder に設定します。これは現在のデータには影響しません。新しいソート順でデータを更新するには、select() をコールします。

sort()、select()、およびorderByClause()も参照して ください。

[virtual] void QSqlTableModel::setTable(const QString &tableName)

モデルを操作するデータベース・テーブルをtableName に設定します。テーブルからデータを選択するのではなく、そのフィールド情報を取得します。

モデルにテーブルのデータを入力するには、select() を呼び出します。

エラー情報はlastError() で取得できます。

select()、setFilter() およびlastError()も参照して ください。

[override virtual] void QSqlTableModel::sort(int column, Qt::SortOrder order)

再実装しています:QAbstractItemModel::sort(int column, Qt::SortOrder order).

ソート順order で、column データをソートします。モデルにデータを入力せずにソート順を設定するには、setSort() を使用してください。

setSort(),select(),orderByClause()も参照してください

[override virtual slot] bool QSqlTableModel::submit()

を参照してください:QAbstractItemModel::submit().

この再実装されたスロットは、ユーザが現在の行の編集を停止したときに、アイテムデリゲートによって呼び出されます。

モデルのストラテジーがOnRowChange またはOnFieldChange に設定されている場合、現在編集中の行をサブミットします。OnManualSubmit ストラテジーの場合は何もしません。

OnManualSubmit ストラテジーの場合、保留中のすべての変更を送信するにはsubmitAll() を使用します。

成功した場合はtrue を返し、そうでない場合はfalse を返します。詳細なエラー情報を照会するには、lastError() を使用します。

モデルを自動的に再投入することはありません。送信された行は、成功時にデータベースからリフレッシュされます。

revert()、revertRow()、submitAll()、revertAll() およびlastError()も参照してください

[slot] bool QSqlTableModel::submitAll()

保留中の変更をすべて提出し、成功するとtrue を返す。エラー時にはfalse を返します。詳細なエラー情報はlastError() で取得できます。

OnManualSubmit で、成功するとモデルが再作成されます。このモデルを表示しているビューは、その選択を失います。

注意:OnManualSubmit モードでは、submitAll() が失敗しても、既にサブミットされた変更はキャッシュからクリアされません。これにより、データを失うことなくトランザクションをロールバックして再投稿することができます。

revertAll() およびlastError()も参照

QString QSqlTableModel::tableName() const

現在選択されているテーブルの名前を返します。

[virtual protected] bool QSqlTableModel::updateRowInTable(int row, const QSqlRecord &values)

現在アクティブなデータベース・テーブルの指定されたrow を、指定されたvalues で更新します。成功した場合はtrue を返し、失敗した場合はfalse を返します。

これは、データベースを直接操作する低レベル・メソッドであり、直接呼び出すべきではありません。値を更新するにはsetData() を使用します。モデルはデータベースを修正するタイミングを編集戦略によって決定します。

generated-flagがセットされた値だけが更新されることに注意してください。generated-flag はQSqlRecord::setGenerated() で設定でき、QSqlRecord::isGenerated() でテストできます。

QSqlRecord::isGenerated() とsetData()も参照して ください。

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