Qt QListWidget: selectedItems()でリスト選択をマスター!
QListWidget::selectedItems()
は、Qt の QListWidget
クラスの非常に便利な関数です。この関数は、現在 QListWidget
内で選択されているすべてのアイテム(項目)のリストを返します。
何を返すのか?
この関数は QListWidgetItem
のリストを返します。具体的には QList<QListWidgetItem*>
型の値を返します。これは、選択されている各アイテムに対応する QListWidgetItem
オブジェクトへのポインタのリストであることを意味します。
いつ使うのか?
主に以下のような状況で使われます。
- ユーザーが選択したアイテムの情報を取得したい場合
例えば、ユーザーがリストから複数のファイル名を選択し、その選択されたファイル名を処理したい場合などです。 - 選択されたアイテムに対して何らかの操作を行いたい場合
選択されたすべてのアイテムの色を変更したり、削除したりする場合などです。 - 複数選択が可能な QListWidget で、どのアイテムが選択されているかを確認したい場合
QListWidget
はデフォルトで単一選択ですが、setSelectionMode()
を使って複数選択(QAbstractItemView::MultiSelection
やQAbstractItemView::ExtendedSelection
)を有効にできます。このような場合、selectedItems()
は非常に役立ちます。
使用例
以下に、QListWidget::selectedItems()
の基本的な使用例を示します。
#include <QApplication>
#include <QListWidget>
#include <QDebug> // デバッグ出力用
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QListWidget listWidget;
// アイテムを追加
listWidget.addItem("Apple");
listWidget.addItem("Banana");
listWidget.addItem("Cherry");
listWidget.addItem("Date");
// 複数選択を許可する設定(オプション)
listWidget.setSelectionMode(QAbstractItemView::MultiSelection);
// 複数のアイテムを選択する(例としてプログラム的に選択)
listWidget.item(0)->setSelected(true); // Apple を選択
listWidget.item(2)->setSelected(true); // Cherry を選択
// 選択されているアイテムのリストを取得
QList<QListWidgetItem*> selected = listWidget.selectedItems();
// 選択されている各アイテムのテキストを表示
qDebug() << "Selected items:";
foreach (QListWidgetItem *item, selected) {
qDebug() << " -" << item->text();
}
listWidget.show();
return a.exec();
}
上記のコードを実行すると、デバッグ出力に以下のように表示されます。
Selected items:
- "Apple"
- "Cherry"
注意点
- もし何も選択されていない場合、この関数は空の
QList
を返します。 selectedItems()
は、ポインタのリストを返します。これらのポインタは、QListWidget
が所有する実際のアイテムオブジェクトを指しています。これらのポインタを直接解放する必要はありません。
QListWidget::selectedItems()
は非常に便利な関数ですが、使用方法によっては予期せぬ挙動やエラーに遭遇することがあります。ここでは、一般的なエラーとそのトラブルシューティング方法を説明します。
エラー: 選択されているアイテムがないのに、アイテムがあると思い込んで処理しようとしている
これは最も一般的なエラーの一つです。selectedItems()
は、何も選択されていない場合、空の QList<QListWidgetItem*>
を返します。この空のリストに対して、あたかもアイテムが存在するかのように処理を継続すると、クラッシュしたり、論理的なエラーが発生したりします。
問題の例
// ユーザーが何も選択していないのに、最初のアイテムにアクセスしようとする
QListWidgetItem *firstSelectedItem = listWidget.selectedItems().at(0); // クラッシュの可能性あり
qDebug() << firstSelectedItem->text();
トラブルシューティング
selectedItems()
の戻り値が空でないか、常に確認するようにしてください。
QList<QListWidgetItem*> selectedItems = listWidget.selectedItems();
if (!selectedItems.isEmpty()) {
// 選択されたアイテムがある場合のみ処理を実行
foreach (QListWidgetItem *item, selectedItems) {
qDebug() << item->text();
}
} else {
qDebug() << "No items are selected.";
// または、ユーザーに選択を促すメッセージを表示
}
エラー: 意図した数のアイテムが選択されていない、または選択モードが正しくない
QListWidget
の選択モードが、アプリケーションの要件と一致していない場合によく発生します。例えば、ユーザーに複数選択をさせたいのに、単一選択モードのままになっている場合などです。
問題の例
- ユーザーが複数選択しているにもかかわらず、
selectedItems().size()
が1になる(これは通常発生しませんが、ロジックエラーで勘違いしている可能性があります)。 QListWidget
のselectionMode
がQAbstractItemView::SingleSelection
に設定されているため、ユーザーは一度に1つのアイテムしか選択できない。
トラブルシューティング
QListWidget
の選択モードを適切に設定しているか確認してください。
- 拡張選択(Shift キーでの範囲選択も可能)
listWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);
- 複数選択(Ctrl/Cmd を押しながら選択、ドラッグ選択)
listWidget->setSelectionMode(QAbstractItemView::MultiSelection);
- 単一選択
listWidget->setSelectionMode(QAbstractItemView::SingleSelection);
また、デバッグ出力を使って selectedItems().size()
を確認し、実際に選択されているアイテムの数が期待通りか検証してください。
QList<QListWidgetItem*> selectedItems = listWidget.selectedItems();
qDebug() << "Number of selected items:" << selectedItems.size();
エラー: シグナルとスロットの接続ミス、または間違ったタイミングで selectedItems() を呼び出している
ユーザーがアイテムを選択したときに特定の処理を行いたい場合、適切なシグナルに接続する必要があります。間違ったシグナルに接続したり、ユーザーの操作とは関係ないタイミングで selectedItems()
を呼び出すと、選択状態が期待と異なる場合があります。
問題の例
itemClicked()
シグナルに接続しているが、これは選択状態の変更ではなくクリックに反応するため、複数選択時などには注意が必要。- ボタンクリック時にのみ
selectedItems()
を呼び出しているが、ユーザーが選択を変更しても即座に反応してほしい場合。
トラブルシューティング
選択状態の変更を検知するには、QListWidget
の itemSelectionChanged()
シグナルを使用するのが最も適切です。
connect(&listWidget, &QListWidget::itemSelectionChanged, [&]() {
QList<QListWidgetItem*> selected = listWidget.selectedItems();
qDebug() << "Selection changed. Currently selected:" << selected.size() << "items.";
foreach (QListWidgetItem *item, selected) {
qDebug() << " -" << item->text();
}
});
このシグナルは、ユーザーがアイテムを選択したり、選択を解除したりするたびに発行されます。
エラー: QListWidgetItem ポインタが不正、または既に削除されている
selectedItems()
から取得した QListWidgetItem*
ポインタを、リストウィジェットからアイテムが削除された後も使い続けようとすると、ダングリングポインタ(無効なポインタ)となり、クラッシュの原因となります。
問題の例
QList<QListWidgetItem*> selected = listWidget.selectedItems();
// ... 何らかの処理 ...
// ここで listWidget から一部のアイテムを削除する
// listWidget.takeItem(index); など
// 削除されたアイテムのポインタを使い続けようとすると危険
foreach (QListWidgetItem *item, selected) {
qDebug() << item->text(); // クラッシュの可能性あり
}
トラブルシューティング
selectedItems()
を呼び出した後、その処理のスコープ内でポインタを使用し、アイテムがリストから削除される可能性のある操作(例: clear()
, takeItem()
など)を行う場合は、ポインタの有効性を再確認するか、必要に応じてテキストなどのコピーを取得しておくことを検討してください。
一般的には、QListWidgetItem
は QListWidget
によって所有・管理されるため、手動で delete
する必要はありません。アイテムを削除する際は、listWidget->takeItem(row)
を使用し、返されたポインタを適切に処理するか、そのポインタが不要であれば解放してください。
QListWidget::selectedItems()
を使う際は、以下の点を特に意識することで、多くの問題を回避できます。
- 戻り値の確認
isEmpty()
を使って、選択アイテムが本当に存在するかを確認する。 - 選択モードの理解
QListWidget
のsetSelectionMode()
が、アプリケーションの要件と一致しているか確認する。 - 適切なシグナルの利用
選択状態の変更を検知するには、itemSelectionChanged()
シグナルを利用する。 - ポインタのライフサイクル
取得したQListWidgetItem*
ポインタが、有効な状態にある間にのみ使用する。
QListWidget::selectedItems()
は、QListWidget
内で現在選択されているすべてのアイテムを取得するために使用される非常に重要な関数です。ここでは、いくつかの具体的なプログラミング例を通して、その使い方を詳しく解説します。
例 1: 基本的な使用法 - 選択されたアイテムのテキストを表示する
この例では、QListWidget
を作成し、いくつかのアイテムを追加します。ユーザーがアイテムを選択し、選択状態が変更されたときに、選択されているすべてのアイテムのテキストをデバッグ出力に表示します。
#include <QApplication>
#include <QMainWindow>
#include <QVBoxLayout>
#include <QListWidget>
#include <QPushButton>
#include <QDebug> // デバッグ出力用
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow window;
QWidget *centralWidget = new QWidget(&window);
QVBoxLayout *layout = new QVBoxLayout(centralWidget);
QListWidget *listWidget = new QListWidget(centralWidget);
listWidget->addItem("Apple");
listWidget->addItem("Banana");
listWidget->addItem("Cherry");
listWidget->addItem("Date");
listWidget->addItem("Elderberry");
// 複数選択を許可する設定
listWidget->setSelectionMode(QAbstractItemView::MultiSelection);
// 選択されたアイテムのテキストを表示するボタン
QPushButton *showSelectedButton = new QPushButton("選択アイテムを表示", centralWidget);
layout->addWidget(listWidget);
layout->addWidget(showSelectedButton);
window.setCentralWidget(centralWidget);
// シグナルとスロットの接続:
// ボタンがクリックされたら、選択されているアイテムのテキストをデバッグ出力に表示
QObject::connect(showSelectedButton, &QPushButton::clicked, [&]() {
QList<QListWidgetItem*> selectedItems = listWidget->selectedItems();
if (selectedItems.isEmpty()) {
qDebug() << "何も選択されていません。";
} else {
qDebug() << "--- 選択されたアイテム ---";
foreach (QListWidgetItem *item, selectedItems) {
qDebug() << " -" << item->text();
}
qDebug() << "-------------------------";
}
});
window.setWindowTitle("QListWidget::selectedItems() 例 1");
window.resize(300, 400);
window.show();
return a.exec();
}
解説
foreach (QListWidgetItem *item, selectedItems)
:Qt のforeach
ループを使用して、選択されたアイテムのリストを効率的に反復処理し、各アイテムのテキストを取得しています。if (selectedItems.isEmpty())
:選択されたアイテムがない場合に備えて、リストが空でないかを確認することが非常に重要です。これにより、ヌルポインタ参照などのクラッシュを防ぎます。QList<QListWidgetItem*> selectedItems = listWidget->selectedItems();
:この行が、現在選択されているすべてのQListWidgetItem
オブジェクトへのポインタのリストを取得する主要な部分です。listWidget->setSelectionMode(QAbstractItemView::MultiSelection);
:これにより、ユーザーはCtrl/Cmdキーを押しながら複数のアイテムを選択できるようになります。これを設定しない場合、デフォルトでは単一選択(SingleSelection
)になります。
例 2: 選択されたアイテムを削除する
この例では、ユーザーが選択したアイテムを QListWidget
から削除する機能を追加します。
#include <QApplication>
#include <QMainWindow>
#include <QVBoxLayout>
#include <QListWidget>
#include <QPushButton>
#include <QDebug>
#include <QMessageBox> // ユーザーへのフィードバック用
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow window;
QWidget *centralWidget = new QWidget(&window);
QVBoxLayout *layout = new QVBoxLayout(centralWidget);
QListWidget *listWidget = new QListWidget(centralWidget);
listWidget->addItem("Item 1");
listWidget->addItem("Item 2");
listWidget->addItem("Item 3");
listWidget->addItem("Item 4");
listWidget->addItem("Item 5");
listWidget->setSelectionMode(QAbstractItemView::MultiSelection); // 複数選択を許可
QPushButton *deleteSelectedButton = new QPushButton("選択アイテムを削除", centralWidget);
layout->addWidget(listWidget);
layout->addWidget(deleteSelectedButton);
window.setCentralWidget(centralWidget);
// シグナルとスロットの接続:
QObject::connect(deleteSelectedButton, &QPushButton::clicked, [&]() {
QList<QListWidgetItem*> selectedItems = listWidget->selectedItems();
if (selectedItems.isEmpty()) {
QMessageBox::information(&window, "情報", "削除するアイテムが選択されていません。");
return;
}
// 削除するアイテムのテキストを記録(オプション)
QStringList deletedTexts;
foreach (QListWidgetItem *item, selectedItems) {
deletedTexts << item->text();
}
// 選択されたアイテムを逆順で削除する
// 重要: 削除によってインデックスが変わるため、逆順で削除するのが安全な方法です。
// もしくは、listWidget->takeItem() を使用して、返されたポインタをdeleteします。
for (int i = selectedItems.size() - 1; i >= 0; --i) {
QListWidgetItem *item = selectedItems.at(i);
delete listWidget->takeItem(listWidget->row(item)); // アイテムをリストから削除し、メモリを解放
}
QMessageBox::information(&window, "削除完了",
QString("以下のアイテムを削除しました:\n%1")
.arg(deletedTexts.join(", ")));
qDebug() << "Deleted items:" << deletedTexts;
});
window.setWindowTitle("QListWidget::selectedItems() 例 2 - 削除");
window.resize(300, 400);
window.show();
return a.exec();
}
解説
- 逆順での削除の重要性
リストからアイテムを削除すると、それ以降のアイテムのインデックスが変わってしまいます。そのため、selectedItems
リストを通常の順序で反復処理しながら削除しようとすると、誤ったアイテムを削除したり、インデックスが無効になったりする可能性があります。逆順で削除することで、この問題を回避できます。 delete listWidget->takeItem(listWidget->row(item));
:これが削除の核心部分です。listWidget->row(item)
:指定されたQListWidgetItem
の現在の行(インデックス)を取得します。listWidget->takeItem(row)
:その行のアイテムをQListWidget
から取り除き、そのQListWidgetItem
のポインタを返します。このとき、QListWidget
はそのアイテムの所有権を放棄します。delete
:takeItem()
によって返されたポインタは、手動でdelete
する必要があります。これにより、QListWidgetItem
オブジェクトが占めていたメモリが解放されます。
例 3: 選択状態の変更をリアルタイムで検知し、別のウィジェットに表示する
この例では、QListWidget
の選択が変更されるたびに、選択されたアイテムの数を別の QLabel
にリアルタイムで表示します。
#include <QApplication>
#include <QMainWindow>
#include <QVBoxLayout>
#include <QListWidget>
#include <QLabel>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow window;
QWidget *centralWidget = new QWidget(&window);
QVBoxLayout *layout = new QVBoxLayout(centralWidget);
QListWidget *listWidget = new QListWidget(centralWidget);
listWidget->addItem("Red");
listWidget->addItem("Green");
listWidget->addItem("Blue");
listWidget->addItem("Yellow");
listWidget->addItem("Black");
listWidget->setSelectionMode(QAbstractItemView::MultiSelection);
QLabel *statusLabel = new QLabel("選択されているアイテム数: 0", centralWidget);
statusLabel->setStyleSheet("font-weight: bold;"); // 見やすくするため
layout->addWidget(listWidget);
layout->addWidget(statusLabel);
window.setCentralWidget(centralWidget);
// シグナルとスロットの接続:
// listWidget の選択が変更されたら、statusLabel を更新する
QObject::connect(listWidget, &QListWidget::itemSelectionChanged, [&]() {
int selectedCount = listWidget->selectedItems().size();
statusLabel->setText(QString("選択されているアイテム数: %1").arg(selectedCount));
// デバッグ出力でも確認
qDebug() << "itemSelectionChanged! Selected count:" << selectedCount;
QList<QListWidgetItem*> selected = listWidget->selectedItems();
QStringList texts;
foreach (QListWidgetItem *item, selected) {
texts << item->text();
}
qDebug() << "Selected texts:" << texts.join(", ");
});
window.setWindowTitle("QListWidget::selectedItems() 例 3 - リアルタイム更新");
window.resize(300, 400);
window.show();
return a.exec();
}
QObject::connect(listWidget, &QListWidget::itemSelectionChanged, [&]() { ... });
:itemSelectionChanged
シグナルは、QListWidget
の選択状態が変更されるたびに(ユーザーがアイテムを選択したり、選択を解除したりするたびに)発行されます。- このシグナルにラムダ式を接続することで、リアルタイムで
selectedItems()
を呼び出し、結果に基づいてstatusLabel
を更新できます。
これらの「代替方法」は、selectedItems()
の機能を完全に置き換えるものではなく、異なるアプローチや、特定の情報が必要な場合に役立つものと理解してください。
QListWidget::selectedIndexes() を使用する
QListWidget
は QListView
を継承しており、QAbstractItemView
からもメソッドを継承しています。selectedIndexes()
は、選択されているアイテムのインデックスのリストを返します。これは QModelIndex
のリストとして返されます。
なぜこれを使うのか?
- データモデルとより密接に連携する複雑なケース(ただし、
QListWidget
はシンプルなアイテムベースのモデルなので、通常はQListWidgetItem
を直接扱う方が簡単です)。 QListWidgetItem*
ではなく、モデルのインデックスに関心がある場合。
使用例
#include <QApplication>
#include <QMainWindow>
#include <QVBoxLayout>
#include <QListWidget>
#include <QPushButton>
#include <QDebug>
#include <QModelIndex> // QModelIndex を使う場合
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow window;
QWidget *centralWidget = new QWidget(&window);
QVBoxLayout *layout = new QVBoxLayout(centralWidget);
QListWidget *listWidget = new QListWidget(centralWidget);
listWidget->addItem("北海道");
listWidget->addItem("青森県");
listWidget->addItem("岩手県");
listWidget->addItem("宮城県");
listWidget->addItem("秋田県");
listWidget->setSelectionMode(QAbstractItemView::MultiSelection);
QPushButton *showIndexesButton = new QPushButton("選択インデックスを表示", centralWidget);
layout->addWidget(listWidget);
layout->addWidget(showIndexesButton);
window.setCentralWidget(centralWidget);
QObject::connect(showIndexesButton, &QPushButton::clicked, [&]() {
QModelIndexList selectedIndexes = listWidget->selectedIndexes();
if (selectedIndexes.isEmpty()) {
qDebug() << "何も選択されていません。";
} else {
qDebug() << "--- 選択されたインデックス ---";
foreach (const QModelIndex &index, selectedIndexes) {
qDebug() << " - Row:" << index.row() << ", Text:" << index.data().toString();
}
qDebug() << "-------------------------";
}
});
window.setWindowTitle("QListWidget::selectedIndexes() 例");
window.resize(300, 400);
window.show();
return a.exec();
}
解説
index.data().toString()
:QModelIndex
からデータ(QListWidgetItem
のテキストなど)を取得します。index.row()
:QModelIndex
から行番号(インデックス)を取得します。QModelIndexList selectedIndexes = listWidget->selectedIndexes();
:選択されているアイテムに対応するQModelIndex
のリストを取得します。
QListWidget::currentItem() を使用する(単一選択時、または最後にフォーカスされたアイテム)
currentItem()
は、QListWidget
内で現在「アクティブ」なアイテム(ハイライトされているが、必ずしも選択されているとは限らない、あるいは単一選択モードで唯一選択されているアイテム)を返します。これは QListWidgetItem*
を返します。
なぜこれを使うのか?
- 通常、
selectedItems()
の代替として単独で使うことは稀です。多くの場合、単一選択モードのQListWidget
で、ユーザーがクリックしたアイテムを即座に処理したい場合に便利です。 QListWidget
がSingleSelection
モードであるとわかっている場合、またはユーザーが最後に操作したアイテムにだけ関心がある場合。
使用例
#include <QApplication>
#include <QMainWindow>
#include <QVBoxLayout>
#include <QListWidget>
#include <QPushButton>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow window;
QWidget *centralWidget = new QWidget(&window);
QVBoxLayout *layout = new QVBoxLayout(centralWidget);
QListWidget *listWidget = new QListWidget(centralWidget);
listWidget->addItem("東京");
listWidget->addItem("大阪");
listWidget->addItem("京都");
listWidget->addItem("福岡");
// 単一選択モード(デフォルトですが明示的に)
listWidget->setSelectionMode(QAbstractItemView::SingleSelection);
QPushButton *showCurrentButton = new QPushButton("現在のアイテムを表示", centralWidget);
layout->addWidget(listWidget);
layout->addWidget(showCurrentButton);
window.setCentralWidget(centralWidget);
QObject::connect(showCurrentButton, &QPushButton::clicked, [&]() {
QListWidgetItem *currentItem = listWidget->currentItem(); // 現在のアイテムを取得
if (currentItem) { // currentItem がヌルポインタでないか確認
qDebug() << "現在のアイテム: " << currentItem->text();
// currentItem->isSelected() で選択されているかも確認できる
qDebug() << "選択されていますか?" << currentItem->isSelected();
} else {
qDebug() << "現在のアイテムはありません(または選択されていません)。";
}
});
window.setWindowTitle("QListWidget::currentItem() 例");
window.resize(300, 400);
window.show();
return a.exec();
}
解説
currentItem->isSelected()
:取得したアイテムが実際に選択状態にあるかを確認できます。QListWidgetItem *currentItem = listWidget->currentItem();
:現在ハイライトされている、または単一選択モードで選択されているアイテムを取得します。
個々の QListWidgetItem::isSelected() をループでチェックする
これは、selectedItems()
が内部的に行っていることと似ていますが、手動で全てのアイテムをループし、それぞれが選択されているかを確認する方法です。
なぜこれを使うのか?
- 特定の条件(例:
QListWidgetItem
にカスタムデータが保存されている場合)に基づいて、選択されたアイテムをフィルタリングしながら処理したい場合。
使用例
#include <QApplication>
#include <QMainWindow>
#include <QVBoxLayout>
#include <QListWidget>
#include <QPushButton>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow window;
QWidget *centralWidget = new QWidget(&window);
QVBoxLayout *layout = new QVBoxLayout(centralWidget);
QListWidget *listWidget = new QListWidget(centralWidget);
listWidget->addItem("Pen");
listWidget->addItem("Pencil");
listWidget->addItem("Eraser");
listWidget->addItem("Notebook");
listWidget->addItem("Ruler");
listWidget->setSelectionMode(QAbstractItemView::MultiSelection);
QPushButton *checkEachButton = new QPushButton("各アイテムの選択状態をチェック", centralWidget);
layout->addWidget(listWidget);
layout->addWidget(checkEachButton);
window.setCentralWidget(centralWidget);
QObject::connect(checkEachButton, &QPushButton::clicked, [&]() {
qDebug() << "--- 各アイテムの選択状態 ---";
QStringList manuallySelectedTexts;
for (int i = 0; i < listWidget->count(); ++i) {
QListWidgetItem *item = listWidget->item(i); // i番目のアイテムを取得
if (item && item->isSelected()) { // アイテムが存在し、かつ選択されているか確認
qDebug() << " - " << item->text() << ": 選択されています";
manuallySelectedTexts << item->text();
} else if (item) {
qDebug() << " - " << item->text() << ": 選択されていません";
}
}
if (manuallySelectedTexts.isEmpty()) {
qDebug() << "何も選択されていません。";
} else {
qDebug() << "手動で検出された選択アイテム: " << manuallySelectedTexts.join(", ");
}
qDebug() << "---------------------------";
});
window.setWindowTitle("QListWidget::isSelected() ループ例");
window.resize(300, 400);
window.show();
return a.exec();
}
解説
if (item && item->isSelected())
:アイテムが存在し、そのアイテムがisSelected()
メソッドによって選択されていると報告された場合にのみ処理を行います。QListWidgetItem *item = listWidget->item(i);
:指定されたインデックスのアイテムを取得します。for (int i = 0; i < listWidget->count(); ++i)
:QListWidget
内のすべてのアイテムをループします。
QListWidget::selectedItems()
は、ほとんどのユースケースで選択されたアイテムのリストを取得するための最も直接的で効率的な方法です。
上記で説明した代替方法は、以下のような特定のシナリオで考慮すると良いでしょう。
- 個々の
QListWidgetItem::isSelected()
をループ: 特定の条件で選択アイテムをフィルタリングしたり、全てのアイテムを検査する必要がある場合に、より詳細な制御が必要な場合。 QListWidget::currentItem()
: 単一選択モードで、ユーザーが最後にアクティブにしたアイテムのみに注目したい場合。QListWidget::selectedIndexes()
: インデックス情報が特に重要で、モデルレベルのデータにアクセスしたい場合。