Qt QTableWidgetのセルを自由自在に操る!item()関数プログラミング例
QTableWidget::item()
とは?
QTableWidget::item(int row, int column)
は、指定された行(row
)と列(column
)のセルに格納されているQTableWidgetItem
オブジェクトへのポインタを返す関数です。
機能
- アイテムの操作
取得したQTableWidgetItem
ポインタを使って、そのセルのテキスト、アイコン、チェック状態、フラグ(編集可能かどうかなど)を変更したり、取得したりすることができます。 - セルのアイテム取得
QTableWidget
内の特定のセルに対応するQTableWidgetItem
を取得するために使用します。
書式
QTableWidgetItem* QTableWidget::item(int row, int column) const
- 戻り値: 指定されたセルにアイテムが存在する場合はその
QTableWidgetItem
へのポインタを返します。アイテムが設定されていない場合はnullptr
を返します。 column
: 取得したいアイテムの列番号(0から始まります)。row
: 取得したいアイテムの行番号(0から始まります)。
#include <QApplication>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QVBoxLayout>
#include <QWidget>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QWidget window;
QVBoxLayout *layout = new QVBoxLayout(&window);
QTableWidget *tableWidget = new QTableWidget(3, 2); // 3行2列のテーブルを作成
// アイテムを設定
tableWidget->setItem(0, 0, new QTableWidgetItem("こんにちは"));
tableWidget->setItem(0, 1, new QTableWidgetItem("世界"));
tableWidget->setItem(1, 0, new QTableWidgetItem("Qt"));
tableWidget->setItem(1, 1, new QTableWidgetItem("プログラミング"));
// item() を使って特定のセルのアイテムを取得し、テキストを変更する例
QTableWidgetItem *item = tableWidget->item(0, 0); // (0,0)のアイテムを取得
if (item) {
item->setText("Hello"); // テキストを変更
}
// item() を使って別のセルのアイテムを取得し、表示する例
QTableWidgetItem *anotherItem = tableWidget->item(1, 1); // (1,1)のアイテムを取得
if (anotherItem) {
qDebug() << "Cell (1,1) text: " << anotherItem->text();
}
layout->addWidget(tableWidget);
window.setLayout(layout);
window.show();
return app.exec();
}
QTableWidget *tableWidget = new QTableWidget(3, 2);
で、3行2列のQTableWidget
を作成します。tableWidget->setItem(...)
を使って、各セルにQTableWidgetItem
オブジェクトを設定し、初期テキストを与えます。QTableWidgetItem *item = tableWidget->item(0, 0);
によって、左上のセル(0行0列)のQTableWidgetItem
を取得します。- 取得した
item
がnullptr
でないことを確認した後、item->setText("Hello");
でそのセルのテキストを「Hello」に変更しています。 - 同様に、
(1,1)
のアイテムを取得し、そのテキストをデバッグ出力しています。
QTableWidget::item()
は、特定のセルの QTableWidgetItem
を取得する便利な関数ですが、使い方を誤ると様々な問題が発生する可能性があります。
nullptr が返ってくる (最も一般的)
エラーの原因
- アイテムの削除
以前にアイテムを削除した場合(例:removeItem()
やtakeItem()
)、その場所にはもうアイテムが存在しないため、nullptr
が返ります。 - 範囲外のインデックス
row
またはcolumn
の値が、テーブルの行数や列数の範囲を超えている場合もnullptr
が返されます。QTableWidget::rowCount()
やQTableWidget::columnCount()
で現在の行数・列数を確認せずにアクセスすると発生しやすいです。 - アイテムが設定されていない
QTableWidget::item(row, column)
は、指定されたセルにQTableWidgetItem
が設定されていない場合にnullptr
を返します。QTableWidget
を作成しただけでは、各セルにアイテムは自動的に作成されません。
トラブルシューティング
- インデックスの範囲を確認する
row
とcolumn
の値が、0
からtableWidget->rowCount() - 1
および0
からtableWidget->columnCount() - 1
の範囲内にあることを確認してください。int row = some_row_index; int col = some_column_index; if (row >= 0 && row < tableWidget->rowCount() && col >= 0 && col < tableWidget->columnCount()) { QTableWidgetItem *item = tableWidget->item(row, col); if (item) { // 処理 } } else { qDebug() << "Index out of bounds!"; }
- nullptr チェックを行う
item()
の戻り値は必ずnullptr
チェックを行ってください。QTableWidgetItem *item = tableWidget->item(row, column); if (item) { // アイテムが存在する場合の処理 item->setText("新しいテキスト"); } else { // アイテムが存在しない場合の処理 (例: エラーログ、または新しいアイテムを作成) qDebug() << "Cell (" << row << "," << column << ") has no item."; tableWidget->setItem(row, column, new QTableWidgetItem("デフォルト値")); }
- setItem() でアイテムを設定する
item()
を呼び出す前に、必ずtableWidget->setItem(row, column, new QTableWidgetItem(...));
のようにして、該当セルにQTableWidgetItem
を設定してください。
アプリケーションのクラッシュ (セグメンテーション違反など)
エラーの原因
- 無効なポインタの使用
アイテムが削除された後も、そのアイテムを指す古いポインタを使用しようとすると、無効なメモリへのアクセスとなりクラッシュすることがあります。 - nullptr ポインタのデリファレンス
上記の「nullptr
が返ってくる」問題と関連しますが、item()
がnullptr
を返したにもかかわらず、そのnullptr
に対してメンバー関数(例:item->setText()
)を呼び出そうとすると、セグメンテーション違反などのクラッシュが発生します。
トラブルシューティング
- ポインタのライフサイクル管理
QTableWidgetItem
はQTableWidget
が所有権を持つため、通常は手動でdelete
する必要はありません(takeItem()
などでアイテムを取得した場合は例外)。しかし、アイテムが削除された後に、そのアイテムを指すポインタを使い続けることがないように注意してください。 - 徹底した nullptr チェック
これが最も重要です。item()
の戻り値を使用する前に、常にif (item)
のようにチェックしてください。
意図しないアイテムの変更
エラーの原因
- 同じ QTableWidgetItem オブジェクトの使い回し
複数のセルに同じQTableWidgetItem
インスタンスを設定しようとすると、Qtはエラーを報告し、クラッシュする可能性があります。QTableWidgetItem
は一度に1つのセルにしか属せません。// 誤った例: 同じアイテムを複数のセルに設定しようとしている QTableWidgetItem *commonItem = new QTableWidgetItem("共有アイテム"); tableWidget->setItem(0, 0, commonItem); tableWidget->setItem(0, 1, commonItem); // ここでエラーまたは問題が発生する可能性が高い
トラブルシューティング
- 各セルに新しいインスタンスを生成する
各セルには、それぞれ独立したQTableWidgetItem
インスタンスを作成して設定する必要があります。// 正しい例 tableWidget->setItem(0, 0, new QTableWidgetItem("アイテム1")); tableWidget->setItem(0, 1, new QTableWidgetItem("アイテム2"));
UIの更新が反映されない
エラーの原因
- モデル/ビューの概念の混同
QTableWidget
は、QTableWidgetItem
を直接操作することでUIが更新されます。しかし、Qtにはより高度なモデル/ビューフレームワーク(QTableView
+QAbstractTableModel
など)があり、それらを使用している場合に、モデルのデータ変更後にビューの更新をトリガーするシグナル/スロット接続が不足していることがあります。QTableWidget
の場合は、通常この問題は発生しませんが、もし類似の振る舞いが見られた場合は、より低レベルな更新関数が必要かもしれません。
- update() や viewport()->update() の呼び出し (通常は不要)
QTableWidget
の場合は、item()
を介した変更で自動的に再描画されるため、明示的にupdate()
を呼び出す必要はほとんどありません。しかし、非常に特殊な状況でUIが更新されない場合は、試す価値があります。 - QTableWidget の場合は通常不要
QTableWidget::item()->setText()
などの操作は、通常、すぐにUIに反映されます。もし反映されない場合は、非常に稀なケースとして、イベントループがブロックされているか、他のUI更新処理が妨げになっている可能性があります。
QTableWidget::item()
は、既存のセルのQTableWidgetItem
オブジェクトを取得するために使われます。取得したQTableWidgetItem
オブジェクトに対して、テキストの変更、アイコンの追加、フォントの変更、チェックボックスの状態操作など、様々な処理を行うことができます。
特定のセルのテキストを取得・変更する
これは最も基本的な使用例です。
#include <QApplication>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QVBoxLayout>
#include <QWidget>
#include <QDebug> // デバッグ出力用
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QWidget window;
QVBoxLayout *layout = new QVBoxLayout(&window);
QTableWidget *tableWidget = new QTableWidget(3, 3); // 3行3列のテーブルを作成
tableWidget->setHorizontalHeaderLabels({"列A", "列B", "列C"});
tableWidget->setVerticalHeaderLabels({"行1", "行2", "行3"});
// (0,0)のセルにアイテムを設定
tableWidget->setItem(0, 0, new QTableWidgetItem("初期テキスト"));
// (0,0)のセルのアイテムを取得し、テキストを変更
QTableWidgetItem *item00 = tableWidget->item(0, 0);
if (item00) { // nullptrチェックは重要!
qDebug() << "変更前の(0,0)のテキスト: " << item00->text();
item00->setText("新しいテキスト");
qDebug() << "変更後の(0,0)のテキスト: " << item00->text();
} else {
qDebug() << "(0,0)にアイテムがありません。";
}
// (1,1)のセルにアイテムが設定されていないことを確認し、その後設定する例
QTableWidgetItem *item11 = tableWidget->item(1, 1);
if (!item11) {
qDebug() << "(1,1)にアイテムがありません。新しく作成します。";
tableWidget->setItem(1, 1, new QTableWidgetItem("新しく追加されたアイテム"));
// 再度アイテムを取得してテキストを読み出す
item11 = tableWidget->item(1, 1);
if (item11) {
qDebug() << "新しく設定された(1,1)のテキスト: " << item11->text();
}
}
layout->addWidget(tableWidget);
window.setLayout(layout);
window.setWindowTitle("QTableWidget::item() テキスト操作");
window.show();
return app.exec();
}
解説
item()
がnullptr
を返す場合(アイテムがまだ設定されていない場合)の処理も示しています。- 取得したポインタが
nullptr
でないことを確認し (if (item00)
)、item00->setText("新しいテキスト");
でテキストを変更します。 QTableWidgetItem *item00 = tableWidget->item(0, 0);
で、そのアイテムのポインタを取得します。tableWidget->setItem(0, 0, new QTableWidgetItem("初期テキスト"));
で、まずアイテムを設定します。
セルの見た目をカスタマイズする (フォント、色、アイコンなど)
QTableWidgetItem
は、セルの表示に関する様々なプロパティを持っています。
#include <QApplication>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QVBoxLayout>
#include <QWidget>
#include <QDebug>
#include <QFont>
#include <QColor>
#include <QBrush>
#include <QIcon>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QWidget window;
QVBoxLayout *layout = new QVBoxLayout(&window);
QTableWidget *tableWidget = new QTableWidget(3, 3);
tableWidget->setHorizontalHeaderLabels({"列A", "列B", "列C"});
tableWidget->setVerticalHeaderLabels({"行1", "行2", "行3"});
// (0,0)にアイテムを設定
tableWidget->setItem(0, 0, new QTableWidgetItem("太字と青色"));
QTableWidgetItem *item00 = tableWidget->item(0, 0);
if (item00) {
QFont font = item00->font();
font.setBold(true);
item00->setFont(font); // フォントを太字に
item00->setForeground(QBrush(Qt::blue)); // 前景色を青に
item00->setBackground(QBrush(QColor(240, 240, 255))); // 背景色を薄い青に
}
// (1,1)にアイコンとツールチップを設定
tableWidget->setItem(1, 1, new QTableWidgetItem(QIcon(":/path/to/your/icon.png"), "アイコン付き")); // アイコンのパスは適宜変更
QTableWidgetItem *item11 = tableWidget->item(1, 1);
if (item11) {
item11->setToolTip("このセルにはアイコンがあります"); // ツールチップを設定
}
// (2,2)にチェックボックスを設定
tableWidget->setItem(2, 2, new QTableWidgetItem("チェック項目"));
QTableWidgetItem *item22 = tableWidget->item(2, 2);
if (item22) {
item22->setFlags(item22->flags() | Qt::ItemIsUserCheckable); // チェック可能にする
item22->setCheckState(Qt::Checked); // 最初からチェック済み
}
layout->addWidget(tableWidget);
window.setLayout(layout);
window.setWindowTitle("QTableWidget::item() カスタマイズ");
window.show();
return app.exec();
}
解説
item22->setCheckState(Qt::Checked);
で、チェックボックスの初期状態を設定します。item22->setFlags(item22->flags() | Qt::ItemIsUserCheckable);
で、セルにチェックボックスを追加し、ユーザーがチェック/アンチェックできるようにします。item11->setToolTip("...");
で、マウスカーソルを乗せたときに表示されるツールチップを設定します。QIcon(":/path/to/your/icon.png")
はQtリソースシステムを使用する例です。実際のアイコンパスに置き換えてください。item00->setFont(font);
でフォントを変更し、item00->setForeground()
やitem00->setBackground()
で色を設定しています。
現在選択されているアイテムを取得する
QTableWidget
の中でユーザーが現在選択している(フォーカスが当たっている)アイテムを取得する例です。
#include <QApplication>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QVBoxLayout>
#include <QPushButton>
#include <QMessageBox>
#include <QWidget>
#include <QDebug>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QWidget window;
QVBoxLayout *layout = new QVBoxLayout(&window);
QTableWidget *tableWidget = new QTableWidget(3, 3);
tableWidget->setHorizontalHeaderLabels({"列A", "列B", "列C"});
tableWidget->setVerticalHeaderLabels({"行1", "行2", "行3"});
// テーブルにデータを設定
for (int row = 0; row < tableWidget->rowCount(); ++row) {
for (int col = 0; col < tableWidget->columnCount(); ++col) {
tableWidget->setItem(row, col, new QTableWidgetItem(QString("セル(%1,%2)").arg(row).arg(col)));
}
}
QPushButton *button = new QPushButton("選択中のセル情報を表示");
QObject::connect(button, &QPushButton::clicked, [&]() {
QTableWidgetItem *currentItem = tableWidget->currentItem(); // 現在選択されているアイテムを取得
if (currentItem) {
QString info = QString("選択中のセル:\n行: %1\n列: %2\nテキスト: %3")
.arg(currentItem->row())
.arg(currentItem->column())
.arg(currentItem->text());
QMessageBox::information(&window, "セル情報", info);
} else {
QMessageBox::information(&window, "セル情報", "セルが選択されていません。");
}
});
layout->addWidget(tableWidget);
layout->addWidget(button);
window.setLayout(layout);
window.setWindowTitle("QTableWidget::currentItem()");
window.show();
return app.exec();
}
解説
- ボタンをクリックすると、選択中のセルの情報をメッセージボックスで表示します。
- このポインタが
nullptr
でなければ、currentItem->row()
、currentItem->column()
、currentItem->text()
などを使って、そのセルの情報を取得できます。 tableWidget->currentItem()
は、現在フォーカスが当たっている(選択されている)QTableWidgetItem
へのポインタを返します。
テーブル内の全アイテムを走査して処理する
すべてのセルに対して何らかの処理を行いたい場合、ループを使って各セルのアイテムを取得します。
#include <QApplication>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QVBoxLayout>
#include <QPushButton>
#include <QDebug>
#include <QWidget>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QWidget window;
QVBoxLayout *layout = new QVBoxLayout(&window);
QTableWidget *tableWidget = new QTableWidget(5, 4); // 5行4列のテーブル
tableWidget->setHorizontalHeaderLabels({"名前", "年齢", "性別", "備考"});
// テーブルにデータを設定 (例として)
for (int row = 0; row < tableWidget->rowCount(); ++row) {
tableWidget->setItem(row, 0, new QTableWidgetItem(QString("名前%1").arg(row + 1)));
tableWidget->setItem(row, 1, new QTableWidgetItem(QString::number(20 + row)));
tableWidget->setItem(row, 2, new QTableWidgetItem((row % 2 == 0) ? "男性" : "女性"));
tableWidget->setItem(row, 3, new QTableWidgetItem("特になし"));
}
QPushButton *processButton = new QPushButton("全セルを走査して年齢をチェック");
QObject::connect(processButton, &QPushButton::clicked, [&]() {
qDebug() << "--- 全セルの年齢をチェック開始 ---";
for (int row = 0; row < tableWidget->rowCount(); ++row) {
// 年齢が格納されていると想定される列 (例: 1列目)
QTableWidgetItem *ageItem = tableWidget->item(row, 1);
if (ageItem) {
bool ok;
int age = ageItem->text().toInt(&ok);
if (ok) {
if (age >= 30) {
qDebug() << QString("行 %1: 年齢 %2 は30歳以上です。").arg(row).arg(age);
ageItem->setBackground(QBrush(QColor(255, 220, 220))); // 背景を赤っぽく
} else {
qDebug() << QString("行 %1: 年齢 %2 は30歳未満です。").arg(row).arg(age);
ageItem->setBackground(QBrush(QColor(220, 255, 220))); // 背景を緑っぽく
}
} else {
qDebug() << QString("行 %1: 年齢列のデータが無効です: %2").arg(row).arg(ageItem->text());
}
} else {
qDebug() << QString("行 %1 の年齢セルにアイテムがありません。").arg(row);
}
}
qDebug() << "--- 全セルの年齢チェック完了 ---";
});
layout->addWidget(tableWidget);
layout->addWidget(processButton);
window.setLayout(layout);
window.setWindowTitle("QTableWidget::item() 全セル走査");
window.show();
return app.exec();
}
- 条件に応じてセルの背景色を変更する例も含まれています。
- 各セルから
item()
でQTableWidgetItem
を取得し、そのテキストを数値に変換して条件分岐を行っています。 - ネストされた
for
ループを使用して、tableWidget->rowCount()
とtableWidget->columnCount()
で取得した行数と列数の範囲内で各セルにアクセスします。
以下に、QTableWidget::item()
の代替となるプログラミング手法をいくつかご紹介します。
QTableWidget の他のヘルパー関数
QTableWidget
には、item()
以外にもセルの情報を取得したり、セルに関連するウィジェットを操作したりするための関数がいくつかあります。
-
cellWidget(int row, int column) / setCellWidget(int row, int column, QWidget *widget)
- 目的
特定のセルに埋め込まれたカスタムウィジェット(QLineEdit
、QPushButton
、QComboBox
など)を取得・設定します。 - 説明
QTableWidgetItem
はテキストやアイコンなどの基本的な情報しか保持できませんが、setCellWidget()
を使うと、より複雑なUI要素をセル内に配置できます。item()
はQTableWidgetItem
を返しますが、cellWidget()
はそのセルに設定された任意のQWidget
を返します。 - 例
// (0,0)にQLineEditを埋め込む QLineEdit *lineEdit = new QLineEdit("編集可能"); tableWidget->setCellWidget(0, 0, lineEdit); // 後でそのQLineEditを取得し、テキストを設定する QLineEdit *retrievedLineEdit = qobject_cast<QLineEdit*>(tableWidget->cellWidget(0, 0)); if (retrievedLineEdit) { retrievedLineEdit->setText("新しい値"); }
- 注意
cellWidget
はQTableWidgetItem
とは独立しており、セルにウィジェットが設定されている場合でもitem()
はnullptr
を返す可能性があります。
- 目的
-
itemAt(const QPoint &pos) または itemAt(int x, int y)
- 目的
指定された座標にあるQTableWidgetItem
を取得します。 - 説明
マウスクリックイベントなど、UI上の位置に基づいてセルを特定したい場合に役立ちます。item()
が行と列のインデックスを直接要求するのに対し、こちらはピクセル座標で指定します。 - 例
// マウスクリックイベントハンドラ内などで使用 void MyWidget::mousePressEvent(QMouseEvent *event) { QTableWidgetItem *clickedItem = tableWidget->itemAt(event->pos()); if (clickedItem) { qDebug() << "クリックされたセルのテキスト: " << clickedItem->text(); } }
- 目的
-
- 目的
現在選択されているすべてのQTableWidgetItem
のリストを取得します。 - 説明
ユーザーが複数のセルを選択している場合に便利です。item()
が単一のセルしか対象としないのに対し、selectedItems()
は選択範囲全体を扱えます。 - 例
QList<QTableWidgetItem*> selected = tableWidget->selectedItems(); for (QTableWidgetItem *item : selected) { qDebug() << "選択中のセル: 行 " << item->row() << ", 列 " << item->column() << ", テキスト: " << item->text(); }
- 目的
QTableWidget
は、Qtの強力なモデル/ビューフレームワークを簡略化したものです。多くの場合、QTableWidget
で十分ですが、以下のような状況ではモデル/ビューフレームワーク(特に QTableView
とカスタムモデル)への移行が推奨されます。
- カスタムの動作
セルが特定のデータ型(例: 日付、通貨)を表示したり、独自の編集ロジックを持つ必要がある場合。 - 複雑なデータ操作
データのフィルタリング、ソート、グルーピング、異なるビューでの同じデータの表示など、複雑なデータ操作が必要な場合。 - データの外部管理
データがデータベースやネットワーク、ファイルなど、アプリケーションの別の場所に保存されている場合。モデル/ビューでは、ビューはデータを直接保持せず、モデルから取得するため、データの一元管理が容易です。 - 大規模なデータセット
数千行以上のデータを扱う場合、QTableWidget
はメモリ消費が大きくなる傾向があります。モデル/ビューでは、必要なデータだけをビューにロードするため、効率的です。
QTableView
+ QStandardItemModel
(中間的な代替)
QStandardItemModel
は、QTableWidget
のように QStandardItem
を使用してデータを管理するモデルです。QTableWidget
のように QTableWidgetItem
を直接操作する代わりに、QStandardItem
を操作し、それを QTableView
に設定します。
利点
QTableWidget
と似た感覚で扱えるため、移行しやすいです。QTableWidget
よりは柔軟性があり、QStandardItem
の機能を使ってセルのプロパティを細かく制御できます。
基本的な流れ
QStandardItemModel
のインスタンスを作成します。model->setItem(row, column, new QStandardItem(...));
のようにして、QStandardItem
をモデルに設定します。QTableView
のインスタンスを作成します。tableView->setModel(model);
でモデルをビューに設定します。- セルのデータを取得・変更したい場合は、
model->item(row, column)
を使用してQStandardItem
を取得し、操作します。
例 (テキストの取得・変更)
#include <QApplication>
#include <QTableView>
#include <QStandardItemModel>
#include <QStandardItem>
#include <QVBoxLayout>
#include <QWidget>
#include <QDebug>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QWidget window;
QVBoxLayout *layout = new QVBoxLayout(&window);
QStandardItemModel *model = new QStandardItemModel(3, 3, &window); // 3行3列のモデル
model->setHorizontalHeaderLabels({"モデル列A", "モデル列B", "モデル列C"});
// モデルにデータを設定
model->setItem(0, 0, new QStandardItem("初期データ (モデル)"));
// モデルから(0,0)のアイテムを取得し、テキストを変更
QStandardItem *item00 = model->item(0, 0);
if (item00) {
qDebug() << "変更前の(0,0)のテキスト (モデル): " << item00->text();
item00->setText("新しいデータ (モデル)");
qDebug() << "変更後の(0,0)のテキスト (モデル): " << item00->text();
} else {
qDebug() << "(0,0)にアイテムがありません (モデル)。";
}
// QTableViewを作成し、モデルを設定
QTableView *tableView = new QTableView(&window);
tableView->setModel(model);
layout->addWidget(tableView);
window.setLayout(layout);
window.setWindowTitle("QTableView + QStandardItemModel");
window.show();
return app.exec();
}
QTableView
+ QAbstractTableModel
(最も強力な代替)
これはQtのモデル/ビュープログラミングの真髄であり、データソース(例: std::vector<MyData>
やデータベース)を直接モデルにマップし、ビューはモデルからデータを要求します。
利点
- 外部データとの連携
データベース、XMLファイル、ネットワークからのデータなど、さまざまなデータソースに直接接続できます。 - 高度なカスタマイズ
データの役割(表示、編集、ソートなど)に応じた振る舞いを細かく定義できます。 - データと表示の分離
データと表示ロジックが完全に分離されるため、コードの保守性や再利用性が向上します。 - メモリ効率
大規模なデータセットでも、必要なデータだけをビューに表示するため、メモリ使用量が少なくて済みます。
基本的な流れ
QAbstractTableModel
を継承したカスタムモデルクラスを作成します。- 以下の純粋仮想関数を実装します。
rowCount(const QModelIndex &parent = QModelIndex()) const
columnCount(const QModelIndex &parent = QModelIndex()) const
data(const QModelIndex &index, int role = Qt::DisplayRole) const
headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const
- データを編集可能にする場合は、さらに以下を実装します。
setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
flags(const QModelIndex &index) const
QTableView
のインスタンスを作成し、作成したカスタムモデルを設定します。
この方法は最も学習コストが高いですが、Qtで複雑なデータ表示を行う上で最も推奨されるアプローチです。