QSqlTableModel Class
QSqlTableModel クラスは、単一のデータベーステーブルに対して編集可能なデータモデルを提供します。詳細...
ヘッダ | #include <QSqlTableModel> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Sql) target_link_libraries(mytarget PRIVATE Qt6::Sql) |
qmake: | QT += sql |
を継承する: | QSqlQueryModel |
継承元: |
- 継承されたメンバを含むすべてのメンバのリスト
- QSqlTableModel はデータベースクラスの一部です。
パブリックタイプ
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ストラテジーは、ユーザーがビューで行った変更が実際にデータベースに適用されるタイミングを決定します。設定可能な値はOnFieldChange 、OnRowChange 、および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 を使用してください。
QSqlRelationalTableModel 、QSqlQuery 、モデル/ビュー・プログラミング、テーブル・モデルの例、およびキャッシュ SQL テーブルも参照してください 。
メンバ型のドキュメント
enum QSqlTableModel::EditStrategy
この列挙型は、データベース内の値を編集する際にどの戦略を選択するかを記述します。
定数 | 値 | 説明 |
---|---|---|
QSqlTableModel::OnFieldChange | 0 | モデルに対するすべての変更は、即座にデータベースに適用されます。 |
QSqlTableModel::OnRowChange | 1 | 行への変更は、ユーザが別の行を選択したときに適用されます。 |
QSqlTableModel::OnManualSubmit | 2 | すべての変更は、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)
このシグナルは、現在アクティブなデータベース・テーブルのrow がrecord からの値で更新される前に、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 は無効でなければならないことに注意してください。
編集ストラテジーOnFieldChange とOnRowChange については、一度に挿入できる行は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() が呼び出されるまで延期されます。
OnFieldChange 、OnRowChange の場合、一度に削除できる行は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)
モデル内のrow にvalues を適用する。ソースフィールドとターゲットフィールドは、レコード内の位置ではなく、フィールド名によってマップされます。
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.