テーブルビューでのデータ表示
QSqlQueryModel 、QSqlTableModel 、およびQSqlRelationalTableModel の各クラスは、QListView 、QTableView 、QTreeView などのQtのビュークラスのデータソースとして使用できます。実際には、SQLの結果セットは本質的に2次元のデータ構造であるため、QTableView が圧倒的に一般的な選択肢となります。

次の例は、SQLデータモデルに基づいたビューを作成するものです。
QTableView *view = new QTableView;
view->setModel(model);
view->show();モデルが読み書き可能なモデル(例:QSqlTableModel )である場合、ビューを通じてユーザーはフィールドを編集できます。これを無効にするには、
view->setEditTriggers(QAbstractItemView::NoEditTriggers);同じモデルを複数のビューのデータソースとして使用できます。ユーザーがいずれかのビューを通じてモデルを編集すると、他のビューにもその変更が即座に反映されます。「テーブルモデル」の例では、その仕組みを示しています。
ビュークラスは、列のラベルを表示するために上部にヘッダーを表示します。ヘッダーのテキストを変更するには、モデルに対してsetHeaderData()を呼び出します。ヘッダーのラベルは、デフォルトでテーブルのフィールド名が使用されます。例えば:
model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
model->setHeaderData(1, Qt::Horizontal, QObject::tr("Name"));
model->setHeaderData(2, Qt::Horizontal, QObject::tr("City"));
model->setHeaderData(3, Qt::Horizontal, QObject::tr("Country"));QTableView また、左側には行番号を示す縦方向のヘッダーもあります。QSqlTableModel::insertRows() を使用してプログラムで行を挿入した場合、新しい行は、submitAll() を使用して送信されるか、ユーザーが別のレコードに移動した際に自動的に送信されるまで(edit strategy がQSqlTableModel::OnRowChange である場合)、アスタリスク(*)でマークされます。

同様に、removeRows() を使用して行を削除した場合、変更が送信されるまで、その行には感嘆符 (!) が付きます。
ビュー内の項目は、デリゲートを使用してレンダリングされます。デフォルトのデリゲートであるQStyledItemDelegate は、最も一般的なデータ型(int 、QString 、QImage など)を扱います。また、ユーザーがビュー内の項目の編集を開始した際に、エディタウィジェット(コンボボックスなど)を提供するのも、このデリゲートの役割です。QAbstractItemDelegate またはQStyledItemDelegate をサブクラス化することで、独自のデリゲートを作成できます。詳細については、「Model/View プログラミング」を参照してください。
QSqlTableModel は、一度に 1 つのテーブルに対して動作するように最適化されています。任意の結果セットに対して動作する読み書き可能なモデルが必要な場合は、QSqlQueryModel をサブクラス化し、flags() およびsetData() を再実装して、読み書き可能にすることができます。以下の 2 つの関数により、クエリモデルのフィールド 1 および 2 を編集可能にします:
Qt::ItemFlags EditableSqlModel::flags(const QModelIndex &index) const
{
Qt::ItemFlags flags = QSqlQueryModel::flags(index);
if (index.column() == 1 || index.column() == 2)
flags |= Qt::ItemIsEditable;
return flags;
}
bool EditableSqlModel::setData(const QModelIndex &index, const QVariant &value, int /* role */)
{
if (index.column() < 1 || index.column() > 2)
return false;
QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0);
int id = data(primaryKeyIndex).toInt();
clear();
bool ok;
if (index.column() == 1)
ok = setFirstName(id, value.toString());
else
ok = setLastName(id, value.toString());
refresh();
return ok;
}setFirstName() ヘルパー関数は次のように定義されています:
bool EditableSqlModel::setFirstName(int personId, const QString &firstName)
{
QSqlQuery query;
query.prepare("update person set firstname = ? where id = ?");
query.addBindValue(firstName);
query.addBindValue(personId);
return query.exec();
}setLastName() 関数も同様です。完全なソースコードについては、クエリモデルの例を参照してください。
モデルをサブクラス化することで、さまざまな方法でカスタマイズが可能になります。アイテムにツールチップを追加したり、背景色を変更したり、計算値を指定したり、表示時と編集時で異なる値を指定したり、NULL値を特別に処理したりなど、さまざまなカスタマイズが可能です。詳細については、「Model/Viewプログラミング」および「QAbstractItemView 」リファレンスドキュメントを参照してください。
単に外部キーをより人間にわかりやすい文字列に変換するだけでよい場合は、QSqlRelationalTableModel を使用できます。最良の結果を得るためには、外部キーの編集用にコンボボックスエディタを提供するデリゲートであるQSqlRelationalDelegate も併せて使用することをお勧めします。

「リレーショナル・テーブル・モデル」のサンプルでは、QSqlRelationalTableModel とQSqlRelationalDelegate を組み合わせて使用し、テーブルに外部キーのサポートを提供する方法を示しています。
© 2026 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.