QListWidget::item() だけじゃない!Qtリスト操作の代替テクニック

2025-05-31

QListWidget::item() とは

QListWidget::item(int row) は、QtのQListWidgetクラスが提供するメンバー関数の一つです。この関数は、指定された行(row)にあるアイテム(QListWidgetItemオブジェクト)へのポインタを返します。

QListWidgetは、リスト形式で項目を表示するためのウィジェットです。各項目はQListWidgetItemというオブジェクトで表現され、テキスト、アイコン、チェック状態、ユーザーデータなど、様々な情報を保持できます。

QListWidget::item() 関数を使うことで、QListWidget内の特定の項目にアクセスし、その項目に対して操作を行ったり、情報を取得したりすることができます。

関数のシグネチャ

QListWidgetItem* QListWidget::item(int row) const
  • const: この関数がオブジェクトの状態を変更しないことを示します。
  • int row: 取得したいアイテムの行番号を指定します。行番号は0から始まります。
  • item: 関数名です。
  • QListWidgetItem*: この関数が返す値の型です。指定された行のアイテムへのポインタです。

使用例

QListWidgetの特定の行にあるアイテムのテキストを取得したり、そのテキストを変更したりする際に、QListWidget::item()がよく使われます。

#include <QApplication>
#include <QListWidget>
#include <QListWidgetItem>
#include <QVBoxLayout>
#include <QWidget>
#include <iostream>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget window;
    QVBoxLayout *layout = new QVBoxLayout(&window);

    QListWidget *listWidget = new QListWidget(&window);

    // アイテムを追加
    listWidget->addItem("Apple");
    listWidget->addItem("Banana");
    listWidget->addItem("Cherry");

    // 1番目の行(インデックス0)のアイテムを取得し、テキストを表示
    QListWidgetItem *firstItem = listWidget->item(0);
    if (firstItem) {
        std::cout << "1番目のアイテムのテキスト: " << firstItem->text().toStdString() << std::endl;
    }

    // 2番目の行(インデックス1)のアイテムを取得し、テキストを変更
    QListWidgetItem *secondItem = listWidget->item(1);
    if (secondItem) {
        secondItem->setText("Grape");
        std::cout << "2番目のアイテムのテキストをGrapeに変更しました。" << std::endl;
    }

    // 全てのアイテムをループして表示
    std::cout << "\n現在のリストのアイテム:" << std::endl;
    for (int i = 0; i < listWidget->count(); ++i) {
        QListWidgetItem *currentItem = listWidget->item(i);
        if (currentItem) {
            std::cout << "  - " << currentItem->text().toStdString() << std::endl;
        }
    }

    layout->addWidget(listWidget);
    window.setWindowTitle("QListWidget::item() Example");
    window.resize(300, 200);
    window.show();

    return app.exec();
}

この例では、QListWidgetに3つのアイテムを追加し、その後item(0)で最初のアイテムを取得してそのテキストを表示し、item(1)で2番目のアイテムを取得してそのテキストを「Grape」に変更しています。最後に、count()関数とループを使って全てのアイテムのテキストを順に表示しています。

  • メモリ管理: QListWidget::item()は既存のQListWidgetItemオブジェクトへのポインタを返すだけであり、新しいオブジェクトを作成するわけではありません。したがって、返されたポインタを自分でdeleteする必要はありません。QListWidgetが破棄される際に、そこに含まれるすべてのアイテムも自動的に破棄されます。
  • 無効なインデックス: 存在しない行番号(例えば、リストの項目数を超えるインデックスや負のインデックス)を指定した場合、nullptrが返されます。そのため、返されたポインタがnullptrでないかを確認してから使用することが重要です。


QListWidget::item()は、指定された行のQListWidgetItemへのポインタを返す便利な関数ですが、いくつかの一般的なエラーが発生する可能性があります。

nullptr の dereference (ヌルポインタ参照外し)

エラーの種類
QListWidget::item(int row)関数は、指定されたrowに有効なアイテムが存在しない場合、nullptr(ヌルポインタ)を返します。このnullptrをチェックせずに参照外し(例: ->text()などを呼び出す)しようとすると、プログラムがクラッシュする原因となります(セグメンテーション違反など)。

一般的なシナリオ

  • アイテムが削除された後
    アイテムをtakeItem()などで削除した後に、そのインデックスにアクセスしようとする場合。
  • 空のリストへのアクセス
    QListWidgetに一つもアイテムがない状態で、item(0)などにアクセスしようとする場合。
  • 存在しないインデックスへのアクセス
    QListWidgetに10個のアイテムしかないのに、item(10)item(20)のように存在しないインデックスにアクセスしようとする場合。

コード例(悪い例)

QListWidget *listWidget = new QListWidget();
// listWidgetには何もアイテムが追加されていないとする

QListWidgetItem *item = listWidget->item(0); // アイテムがないのでitemはnullptrになる
QString text = item->text(); // !!! ここでクラッシュする可能性が高い (nullptr参照外し)

トラブルシューティング/解決策
QListWidget::item()から返されたポインタがnullptrでないことを必ずチェックしてから使用します。

QListWidget *listWidget = new QListWidget();
listWidget->addItem("First Item"); // アイテムを1つ追加

QListWidgetItem *item = listWidget->item(0);
if (item) { // nullptrチェック
    QString text = item->text();
    qDebug() << "アイテムのテキスト:" << text;
} else {
    qDebug() << "指定されたインデックスにアイテムが存在しません。";
}

// 存在しないインデックスへのアクセス例
QListWidgetItem *nonExistentItem = listWidget->item(1);
if (nonExistentItem) {
    // このブロックは実行されない
} else {
    qDebug() << "インデックス1にはアイテムが存在しません。"; // このメッセージが表示される
}

このチェックは、QListWidget::count()関数と組み合わせて、ループ処理を行う際にも重要です。

for (int i = 0; i < listWidget->count(); ++i) {
    QListWidgetItem *item = listWidget->item(i);
    // itemはここでは常にnullptrでないことが保証される
    qDebug() << item->text();
}

QListWidgetItem オブジェクトのライフサイクル管理の誤り

エラーの種類
QListWidget::item()は、QListWidgetが所有する既存のQListWidgetItemへのポインタを返します。このポインタを自分でdeleteしようとすると、二重解放(double free)などのメモリ関連のエラーが発生し、クラッシュや未定義動作の原因となります。

一般的なシナリオ

  • QListWidgetItemをスタックに作成し、そのポインタをQListWidgetに追加してしまう(addItem()はポインタを受け取るため、スタックオブジェクトのアドレスを渡してしまう)。スタックオブジェクトはスコープを抜けると破棄されるため、QListWidgetが不正なポインタを持つことになる。
  • QListWidget::item()で取得したポインタに対してdeleteを呼び出してしまう。

コード例(悪い例)

QListWidget *listWidget = new QListWidget();
listWidget->addItem(new QListWidgetItem("Item 1")); // ヒープに作成し、QListWidgetに所有権を渡す

QListWidgetItem *itemToDelete = listWidget->item(0);
// delete itemToDelete; // !!! 間違い: QListWidgetが所有するアイテムを削除してはいけない
// QListWidget::takeItem() を使用して、所有権を明示的に放棄する必要があります。
QListWidget *listWidget = new QListWidget();
{
    QListWidgetItem item("Stack Item"); // スタックにQListWidgetItemを作成
    listWidget->addItem(&item); // !!! 間違い: スタック変数のアドレスを渡す
} // ここで item は破棄される。listWidgetは不正なポインタを持つ

// その後、listWidget->item(0) にアクセスしようとするとクラッシュする可能性がある

トラブルシューティング/解決策

  • アイテムをリストから削除する際
    特定のアイテムをリストから削除したい場合は、QListWidget::takeItem(int row)を使用します。この関数は、指定されたアイテムをリストから取り除き、そのアイテムへのポインタを返します。返されたポインタのメモリは呼び出し側が管理する必要があります(つまり、必要であればdeleteする)。
  • QListWidgetの所有権を尊重する
    QListWidgetaddItem(QListWidgetItem *item)で追加されたアイテムは、QListWidgetによって所有され、QListWidgetが破棄される際に自動的に解放されます。
QListWidget *listWidget = new QListWidget();
listWidget->addItem(new QListWidgetItem("Item A"));
listWidget->addItem(new QListWidgetItem("Item B"));

// アイテムをリストから取り除く
QListWidgetItem *removedItem = listWidget->takeItem(0); // インデックス0のアイテムを取り除く
if (removedItem) {
    qDebug() << "削除されたアイテムのテキスト:" << removedItem->text();
    delete removedItem; // 取り除いたアイテムのメモリは手動で解放する
}

// QListWidgetItemを常にヒープに作成する
// addItem() には new を使用して作成したオブジェクトのポインタを渡す
QListWidgetItem *newItem = new QListWidgetItem("New Heap Item");
listWidget->addItem(newItem);

不適切な型変換(まれだが可能性あり)

エラーの種類
QListWidget::item()QListWidgetItem*を返します。もしQListWidgetItemを継承したカスタムクラスを使用している場合、ダウンキャストが必要になることがありますが、不正確なダウンキャストは未定義動作を引き起こす可能性があります。

一般的なシナリオ

  • MyCustomItemというQListWidgetItemの派生クラスを作成し、それをQListWidgetに追加した後、QListWidget::item()で取得したQListWidgetItem*を直接MyCustomItem*にキャストしようとする場合。

コード例(潜在的な問題を含む例)

class MyCustomItem : public QListWidgetItem {
public:
    MyCustomItem(const QString &text) : QListWidgetItem(text) {}
    void customMethod() { /* ... */ }
};

QListWidget *listWidget = new QListWidget();
listWidget->addItem(new MyCustomItem("Custom Data"));
listWidget->addItem(new QListWidgetItem("Normal Data"));

// 最初のアイテムはMyCustomItemだが、2番目のアイテムはQListWidgetItem
QListWidgetItem *item0 = listWidget->item(0);
MyCustomItem *customItem0 = static_cast<MyCustomItem*>(item0); // 安全ではないキャスト
customItem0->customMethod(); // OK

QListWidgetItem *item1 = listWidget->item(1);
MyCustomItem *customItem1 = static_cast<MyCustomItem*>(item1); // !!! 危険: 実行時エラーの可能性
// customItem1->customMethod(); // ここでクラッシュする可能性がある
  • dynamic_castを使用する
    QListWidgetItem*からカスタムの派生クラスへキャストする場合は、dynamic_castを使用し、キャストが成功したかどうかをチェックします。dynamic_castはランタイムタイプ情報(RTTI)を必要としますが、安全なダウンキャストを提供します。
QListWidgetItem *item1 = listWidget->item(1);
MyCustomItem *customItem1 = dynamic_cast<MyCustomItem*>(item1);
if (customItem1) {
    customItem1->customMethod(); // キャストが成功した場合のみ実行
} else {
    qDebug() << "アイテムはMyCustomItem型ではありません。";
}
  • ユーザーデータを活用する
    アイテムにカスタムデータを関連付けたいだけであれば、QListWidgetItem::setData()QListWidgetItem::data()を使用する方が、カスタムクラスを作成してキャストするよりもシンプルで安全な場合があります。
// Qt::UserRole を使用してカスタムデータを保存
listWidget->addItem("Item with Custom Data");
listWidget->item(0)->setData(Qt::UserRole, QVariant("Hello, World!"));

// カスタムデータを取得
QVariant customData = listWidget->item(0)->data(Qt::UserRole);
if (customData.isValid()) {
    qDebug() << "カスタムデータ:" << customData.toString();
}


QListWidget::item(int row) は、QListWidget内の特定のQListWidgetItemにアクセスするための基本的な関数です。この関数を使って、アイテムの情報の取得、変更、削除などの操作を行います。

基本的なアイテムの取得と表示

最も基本的な使用例です。QListWidgetにアイテムを追加し、特定の行のアイテムのテキストを取得して表示します。

#include <QApplication>
#include <QListWidget>
#include <QListWidgetItem>
#include <QVBoxLayout>
#include <QWidget>
#include <QDebug> // デバッグ出力用

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget window;
    QVBoxLayout *layout = new QVBoxLayout(&window);

    QListWidget *listWidget = new QListWidget(&window);

    // アイテムを追加
    listWidget->addItem("Apple");    // インデックス 0
    listWidget->addItem("Banana");   // インデックス 1
    listWidget->addItem("Cherry");   // インデックス 2
    listWidget->addItem("Date");     // インデックス 3

    // 特定の行のアイテムを取得し、テキストを表示
    int targetRow = 1; // 2番目のアイテム (Banana)
    QListWidgetItem *item = listWidget->item(targetRow);

    if (item) { // nullptr チェックは重要!
        qDebug() << QString("インデックス %1 のアイテム: %2").arg(targetRow).arg(item->text());
    } else {
        qDebug() << QString("インデックス %1 にアイテムは存在しません。").arg(targetRow);
    }

    // 存在しないインデックスにアクセスした場合の例
    targetRow = 10;
    QListWidgetItem *nonExistentItem = listWidget->item(targetRow);
    if (nonExistentItem) {
        qDebug() << nonExistentItem->text(); // ここは実行されない
    } else {
        qDebug() << QString("インデックス %1 にアイテムは存在しません(エラー例)。").arg(targetRow);
    }

    layout->addWidget(listWidget);
    window.setWindowTitle("QListWidget::item() - Get Text");
    window.resize(300, 200);
    window.show();

    return app.exec();
}

解説

  • item->text()でアイテムのテキストを取得できます。
  • 取得したポインタがnullptrでないことを必ずチェックします。これは、指定された行にアイテムが存在しない場合にクラッシュを防ぐためです。
  • listWidget->item(targetRow)で指定された行のQListWidgetItemへのポインタを取得します。
  • listWidget->addItem()でアイテムを追加します。

アイテムの情報を変更する

取得したQListWidgetItemオブジェクトのメソッドを使って、その情報を変更できます。

#include <QApplication>
#include <QListWidget>
#include <QListWidgetItem>
#include <QVBoxLayout>
#include <QWidget>
#include <QDebug>
#include <QFont>
#include <QBrush>
#include <QColor>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget window;
    QVBoxLayout *layout = new QVBoxLayout(&window);

    QListWidget *listWidget = new QListWidget(&window);

    listWidget->addItem("Original Text 1");
    listWidget->addItem("Original Text 2");
    listWidget->addItem("Original Text 3");

    // インデックス0のアイテムのテキストを変更
    QListWidgetItem *item0 = listWidget->item(0);
    if (item0) {
        item0->setText("Modified Text for Item 0");
    }

    // インデックス1のアイテムのフォントと色を変更
    QListWidgetItem *item1 = listWidget->item(1);
    if (item1) {
        QFont font = item1->font();
        font.setBold(true);
        font.setPointSize(14);
        item1->setFont(font);
        item1->setForeground(QBrush(Qt::blue)); // 前景色(テキストの色)
        item1->setBackground(QBrush(QColor(200, 255, 200))); // 背景色
    }

    // インデックス2のアイテムにアイコンとチェックボックスを追加
    QListWidgetItem *item2 = listWidget->item(2);
    if (item2) {
        item2->setText("Item with Icon and Checkbox");
        item2->setIcon(QIcon(":/path/to/your/icon.png")); // 適切なアイコンのパスに置き換える
        item2->setFlags(item2->flags() | Qt::ItemIsUserCheckable); // チェック可能にするフラグを追加
        item2->setCheckState(Qt::Checked); // 初期状態をチェック済みに設定
    }

    // 現在の全てのアイテムの情報をデバッグ出力
    qDebug() << "\n--- Current List Items ---";
    for (int i = 0; i < listWidget->count(); ++i) {
        QListWidgetItem *currentItem = listWidget->item(i);
        if (currentItem) {
            qDebug() << QString("Row %1: Text='%2', Checked=%3")
                        .arg(i)
                        .arg(currentItem->text())
                        .arg(currentItem->checkState() == Qt::Checked ? "Yes" : "No");
        }
    }

    layout->addWidget(listWidget);
    window.setWindowTitle("QListWidget::item() - Modify Properties");
    window.resize(400, 300);
    window.show();

    return app.exec();
}

解説

  • アイコンを設定するには、QIconオブジェクトをitem->setIcon()に渡します。:/path/to/your/icon.pngは、QRCファイル(リソースファイル)に登録されたアイコンのパスです。
  • item->setFlags()item->setCheckState()を使って、チェックボックスの動作を制御できます。
  • item->setFont(), item->setForeground(), item->setBackground()などで外観を変更できます。
  • item->setText()でテキストを変更します。

アイテムの削除と移動

QListWidget::item()自体はアイテムを削除しませんが、takeItem()と組み合わせて使用できます。

#include <QApplication>
#include <QListWidget>
#include <QListWidgetItem>
#include <QVBoxLayout>
#include <QWidget>
#include <QPushButton>
#include <QDebug>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget window;
    QVBoxLayout *layout = new QVBoxLayout(&window);

    QListWidget *listWidget = new QListWidget(&window);
    listWidget->addItem("Item A");
    listWidget->addItem("Item B");
    listWidget->addItem("Item C");
    listWidget->addItem("Item D");

    QPushButton *removeButton = new QPushButton("選択アイテムを削除", &window);
    QPushButton *moveButton = new QPushButton("アイテムを移動", &window);

    // 選択されたアイテムを削除するスロット
    QObject::connect(removeButton, &QPushButton::clicked, [&]() {
        QListWidgetItem *selectedItem = listWidget->currentItem(); // 現在選択されているアイテム
        if (selectedItem) {
            int row = listWidget->row(selectedItem); // アイテムの行インデックスを取得
            QListWidgetItem *removedItem = listWidget->takeItem(row); // リストからアイテムを取り除く
            if (removedItem) {
                qDebug() << QString("'%1' を削除しました。").arg(removedItem->text());
                delete removedItem; // 取り除いたアイテムのメモリを解放
            }
        } else {
            qDebug() << "削除するアイテムが選択されていません。";
        }
    });

    // アイテムを移動するスロット(例: 0番目のアイテムを末尾に移動)
    QObject::connect(moveButton, &QPushButton::clicked, [&]() {
        if (listWidget->count() > 0) {
            QListWidgetItem *itemToMove = listWidget->takeItem(0); // 0番目のアイテムを取り除く
            if (itemToMove) {
                listWidget->addItem(itemToMove); // 末尾に追加
                qDebug() << QString("'%1' を末尾に移動しました。").arg(itemToMove->text());
            }
        } else {
            qDebug() << "移動するアイテムがありません。";
        }
    });

    layout->addWidget(listWidget);
    layout->addWidget(removeButton);
    layout->addWidget(moveButton);
    window.setWindowTitle("QListWidget::item() - Delete & Move");
    window.resize(300, 250);
    window.show();

    return app.exec();
}

解説

  • アイテムを移動する際は、takeItem()で取り除いた後、addItem()insertItem()で再度追加します。
  • listWidget->takeItem(row)は、指定された行のアイテムをリストから取り除き、そのポインタを返します。リストウィジェットはアイテムの所有権を放棄するため、返されたポインタが不要になったら自分でdeleteする必要がある点に注意してください。
  • listWidget->row(selectedItem)QListWidgetItemオブジェクトの行インデックスを取得します。
  • listWidget->currentItem()で現在選択されているアイテムを取得できます。

カスタムデータとQListWidgetItem::item()

QListWidgetItemには、setData()data()を使ってカスタムデータを保存できます。これは、特定のアイテムに関連付けたい追加情報がある場合に非常に便利です。

#include <QApplication>
#include <QListWidget>
#include <QListWidgetItem>
#include <QVBoxLayout>
#include <QWidget>
#include <QDebug>
#include <QVariant> // QVariantは任意のデータを保存できる

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget window;
    QVBoxLayout *layout = new QVBoxLayout(&window);

    QListWidget *listWidget = new QListWidget(&window);

    // アイテム1: 商品名と価格をカスタムデータとして保存
    QListWidgetItem *item1 = new QListWidgetItem("Laptop");
    item1->setData(Qt::UserRole, QVariant(1200.00)); // 価格をUserRoleに保存
    listWidget->addItem(item1);

    // アイテム2: 人物の名前と年齢をカスタムデータとして保存
    QListWidgetItem *item2 = new QListWidgetItem("Alice");
    item2->setData(Qt::UserRole, QVariant(30)); // 年齢をUserRoleに保存
    listWidget->addItem(item2);

    // アイテム3: 別のアイテム
    listWidget->addItem("Book");

    // 各アイテムのテキストとカスタムデータを取得して表示
    qDebug() << "\n--- Items with Custom Data ---";
    for (int i = 0; i < listWidget->count(); ++i) {
        QListWidgetItem *currentItem = listWidget->item(i);
        if (currentItem) {
            qDebug() << QString("Row %1: Text='%2'").arg(i).arg(currentItem->text());

            QVariant customData = currentItem->data(Qt::UserRole);
            if (customData.isValid()) {
                // データ型によって取り出し方を分岐
                if (customData.typeId() == QMetaType::Double) {
                    qDebug() << QString("  Price: $%.2f").arg(customData.toDouble());
                } else if (customData.typeId() == QMetaType::Int) {
                    qDebug() << QString("  Age: %1").arg(customData.toInt());
                } else {
                    qDebug() << QString("  Other Custom Data: %1").arg(customData.toString());
                }
            } else {
                qDebug() << "  カスタムデータなし";
            }
        }
    }

    layout->addWidget(listWidget);
    window.setWindowTitle("QListWidget::item() - Custom Data");
    window.resize(350, 250);
    window.show();

    return app.exec();
}
  • item->data(role)でカスタムデータをQVariantとして取得し、isValid()で有効性をチェックした後、適切な型に変換して使用します。
  • QVariantは、様々なデータ型(int, double, QStringなど)を保持できるQtの汎用型です。
  • Qt::UserRoleは、Qtが内部で使用するロール(Qt::DisplayRoleQt::DecorationRoleなど)と競合しない、ユーザーが定義できるカスタムデータの開始点です。


QListWidget::item(int row) は特定のインデックスのアイテムにアクセスする直接的な方法ですが、状況によっては他のアプローチがより適切である場合があります。

QListWidget::currentItem() と QListWidget::selectedItems()

これらの関数は、ユーザーの選択に基づいてアイテムにアクセスする際に非常に便利です。

  • QListWidget::selectedItems() const: 選択されているすべてのアイテムのリスト(QList<QListWidgetItem*>)を返します。複数選択モードの場合に特に役立ちます。

    // 例: 選択されている全てのアイテムのテキストを取得
    QList<QListWidgetItem*> selectedItems = listWidget->selectedItems();
    if (!selectedItems.isEmpty()) {
        qDebug() << "選択中のアイテム:";
        for (QListWidgetItem *item : selectedItems) {
            qDebug() << "  - " << item->text();
        }
    } else {
        qDebug() << "アイテムが選択されていません。";
    }
    
  • QListWidget::currentItem() const: 現在(単一選択モードの場合)選択されているアイテム、またはフォーカスを持っているアイテムへのポインタを返します。何も選択されていない場合はnullptrを返します。 ユーザーがリスト内の項目を操作するイベント(クリック、キー操作など)に応答する際に便利です。

    // 例: 現在選択されているアイテムのテキストを取得
    QListWidgetItem *currentItem = listWidget->currentItem();
    if (currentItem) {
        qDebug() << "選択中のアイテム: " << currentItem->text();
    } else {
        qDebug() << "アイテムが選択されていません。";
    }
    

シグナルとスロットによるイベント駆動型アクセス

QListWidgetは、ユーザーのアクション(クリック、ダブルクリック、アイテムの変更など)に応じてシグナルを発行します。これらのシグナルをスロットに接続することで、ユーザーが操作したアイテムに直接アクセスできます。

  • itemChanged(QListWidgetItem *item): アイテムのデータ(テキスト、チェック状態など)が変更されたときに発行されます。通常は、item->setText()などでプログラム的に変更された場合ではなく、ユーザーがアイテムを編集(Qt::ItemIsEditableフラグが設定されている場合)した場合に発生します。

    // 例: アイテムのテキストがユーザーによって編集されたら新しいテキストを表示
    QObject::connect(listWidget, &QListWidget::itemChanged,
                     [](QListWidgetItem *item){
        qDebug() << "アイテムが変更されました: " << item->text();
    });
    
  • currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous): 現在の選択が変更されたときに発行されます。新しく選択されたアイテムと以前選択されていたアイテムへのポインタが提供されます。

    // 例: 選択が変更されたら、新しい選択アイテムの情報を表示
    QObject::connect(listWidget, &QListWidget::currentItemChanged,
                     [](QListWidgetItem *current, QListWidgetItem *previous){
        if (current) {
            qDebug() << "新しい選択アイテム: " << current->text();
        }
        if (previous) {
            qDebug() << "以前の選択アイテム: " << previous->text();
        }
    });
    
  • itemDoubleClicked(QListWidgetItem *item): アイテムがダブルクリックされたときに発行されます。

    // 例: アイテムがダブルクリックされたら何か処理を行う
    QObject::connect(listWidget, &QListWidget::itemDoubleClicked,
                     [](QListWidgetItem *item){
        qDebug() << "ダブルクリックされたアイテム: " << item->text();
        // 例: 別のウィンドウを開くなど
    });
    
  • itemClicked(QListWidgetItem *item): アイテムがクリックされたときに、クリックされたアイテムへのポインタを引数として発行されます。

    // 例: アイテムがクリックされたらそのテキストを表示
    QObject::connect(listWidget, &QListWidget::itemClicked,
                     [](QListWidgetItem *item){
        qDebug() << "クリックされたアイテム: " << item->text();
    });
    

QListWidget::findItems()

特定のテキストやマッチング基準に基づいてアイテムを検索したい場合に便利です。

  • QList<QListWidgetItem*> QListWidget::findItems(const QString &text, Qt::MatchFlags flags) const: 指定されたテキストとマッチングフラグに基づいて、リスト内のアイテムを検索し、マッチするすべてのアイテムのリストを返します。

    // 例: テキストが "Apple" のアイテムをすべて検索
    QList<QListWidgetItem*> foundItems = listWidget->findItems("Apple", Qt::MatchExactly);
    
    if (!foundItems.isEmpty()) {
        qDebug() << "見つかったアイテム:";
        for (QListWidgetItem *item : foundItems) {
            qDebug() << "  - " << item->text() << " (行: " << listWidget->row(item) << ")";
        }
    } else {
        qDebug() << "該当するアイテムは見つかりませんでした。";
    }
    

    Qt::MatchFlagsには以下のようなものがあります:

    • Qt::MatchExactly: 完全一致
    • Qt::MatchContains: 部分一致
    • Qt::MatchCaseSensitive: 大文字小文字を区別
    • Qt::MatchWrap: リストの末尾に到達したら先頭に戻って検索を続行

QListWidget::row(const QListWidgetItem *item) const