QSqlTableModel Class

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

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

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

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

注意: 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)

モデル内のrowvalues を適用する。ソースフィールドとターゲットフィールドは、レコード内の位置ではなく、フィールド名によってマップされます。

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()も参照

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