もう迷わない!QListWidget addItems()の代替手法:addItem()とモデル/ビュー徹底解説

2025-05-31

QListWidget::addItems() は、QtフレームワークにおけるGUIプログラミングで使用される QListWidget クラスの非常に便利なメンバー関数です。

QListWidgetとは?

まず、QListWidget について簡単に説明します。QListWidget は、ユーザーがアイテム(項目)のリストを表示し、操作できるウィジェットです。ファイルリスト、選択可能なオプションのリストなど、様々な場面で利用されます。各アイテムは QListWidgetItem オブジェクトとして管理されます。

addItems()の機能

QListWidget::addItems() メソッドは、複数の文字列を一度に QListWidget に追加するために使用されます。通常、PythonやC++などのプログラミング言語では、文字列のリスト(例えば QStringListlist of strings)を引数として受け取ります。このメソッドを呼び出すと、引数として渡された各文字列が新しい QListWidgetItem として QListWidget の末尾に追加されます。

手動で一つずつ addItem() を呼び出すよりも、多数のアイテムを追加する際に効率的でコードも簡潔になります。

使用例

以下に、Python (PyQt) と C++ (Qt) での簡単な使用例を示します。

Python (PyQt) の例

from PyQt5.QtWidgets import QApplication, QListWidget, QMainWindow
import sys

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QListWidget addItems() Example")
        self.setGeometry(100, 100, 300, 200)

        self.list_widget = QListWidget(self)
        self.list_widget.setGeometry(10, 10, 280, 180)

        # 追加するアイテムのリスト
        items_to_add = ["Apple", "Banana", "Cherry", "Date", "Elderberry"]

        # addItems() を使って一括追加
        self.list_widget.addItems(items_to_add)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())
#include <QApplication>
#include <QListWidget>
#include <QMainWindow>
#include <QStringList> // QStringList を使うために必要

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

    QMainWindow window;
    window.setWindowTitle("QListWidget addItems() Example");
    window.setGeometry(100, 100, 300, 200);

    QListWidget *listWidget = new QListWidget(&window);
    listWidget->setGeometry(10, 10, 280, 180);

    // 追加するアイテムのリスト
    QStringList itemsToAdd;
    itemsToAdd << "Apple" << "Banana" << "Cherry" << "Date" << "Elderberry";

    // addItems() を使って一括追加
    listWidget->addItems(itemsToAdd);

    window.show();
    return app.exec();
}


QListWidget::addItems() は非常に便利な関数ですが、いくつか一般的なエラーや予期せぬ挙動が発生することがあります。ここでは、それらの問題と解決策を説明します。

想定したアイテムが表示されない、または数が合わない

考えられる原因

  • ウィジェットが正しく表示されていない
    QListWidget 自体がレイアウトに含まれていない、またはshow()されていないために見えないだけかもしれません。
  • 非文字列型の要素が含まれている
    addItems() は文字列のリストを期待しています。リスト内に数値や他のオブジェクトが含まれている場合、それらは正しく表示されないか、エラーの原因になることがあります。
  • 空のリストを渡している
    addItems() に空の QStringList (C++) や空の list (Python) を渡した場合、何も追加されません。

トラブルシューティング

  • ウィジェットの可視性を確認
    QListWidget が親ウィジェットのレイアウトに追加されているか、または直接 show() されているかを確認します。
  • 型変換
    リストに文字列以外のデータが含まれている場合は、QString (C++) や str() (Python) を使って明示的に文字列に変換してから渡します。
    • Python例
      items_to_add = [str(item) for item in original_list]
    • C++例
      QStringList stringList; for (auto val : originalList) stringList << QString::number(val);
  • 渡しているリストの内容を確認
    デバッグ出力(qDebug() / print())を使って、addItems() に渡すリストが期待通りの内容(文字列のみで、空ではない)になっているか確認します。

アプリケーションがクラッシュする、またはエラーが発生する

考えられる原因

  • 異なるスレッドからのアクセス
    GUI操作(QListWidget の更新など)はメインスレッドで行われる必要があります。別のスレッドから addItems() を呼び出そうとすると、クラッシュや予期せぬ動作につながることがあります。
  • 無効なポインタ(C++のみ)
    QListWidget のインスタンスがNULLポインタであるか、すでに解放されたオブジェクトに対して addItems() を呼び出そうとしている可能性があります。

トラブルシューティング

  • スレッドセーフな更新
    他のスレッドから QListWidget を更新する必要がある場合は、シグナルとスロットのメカニズムを使用して、メインスレッドに処理を委譲します。
    • メインスレッドでスロットを作成し、そのスロット内で addItems() を呼び出すようにします。
    • 他のスレッドからは、このスロットに接続されたシグナルを発行します。
  • C++でのポインタ確認
    QListWidget オブジェクトを操作する前に、ポインタが有効であることを確認します(例: if (myListWidget))。new で生成した場合は、delete されるまで有効です。

追加されたアイテムの順序が期待と異なる

考えられる原因

  • 渡したリストの順序が間違っている
    addItems() は渡されたリストの要素の順序をそのまま保持します。もし順序が違うなら、それは渡す前のリストの段階で間違っている可能性があります。

トラブルシューティング

  • ソースデータの確認
    addItems() に渡す前の元のリスト(QStringListlist)の順序が正しいかを確認します。必要に応じて、事前にソートなどの処理を行います。

パフォーマンスの問題(大量のアイテムを追加する場合)

考えられる原因

  • UIの更新頻度
    非常に大量のアイテム(例えば数千から数万)を一度に addItems() で追加すると、UIの更新処理がボトルネックになり、一時的にアプリケーションがフリーズしたように見えることがあります。
  • 遅延ロード/仮想リストビュー
    非常に大規模なデータセットの場合、QListWidget のようなアイテムベースのウィジェットではなく、QListView とカスタムモデル(QAbstractListModelのサブクラス)を使用することを検討します。これにより、画面に表示されるアイテムだけをロードする「仮想リストビュー」のような実装が可能になり、メモリ使用量とパフォーマンスが大幅に向上します。
  • setUpdatesEnabled(false) / true の使用
    addItems() を呼び出す前に QListWidget::setUpdatesEnabled(false) を設定し、すべてのアイテムを追加し終えた後に QListWidget::setUpdatesEnabled(true) を呼び出すことで、UIの更新を一時的に停止させ、処理を高速化できます。
    // C++
    listWidget->setUpdatesEnabled(false);
    listWidget->addItems(largeListOfItems);
    listWidget->setUpdatesEnabled(true);
    
    # Python
    list_widget.setUpdatesEnabled(False)
    list_widget.addItems(large_list_of_items)
    list_widget.setUpdatesEnabled(True)
    


QListWidget::addItems() は、QStringList (C++) または文字列のリスト (Python) を引数として受け取り、その中の各文字列を新しいリストアイテムとして QListWidget の末尾に追加します。

基本的な使用例

最も一般的なシナリオは、あらかじめ用意された文字列のリストを QListWidget に追加することです。

Python (PyQt/PySide) の例

この例では、基本的な QApplicationQMainWindow を設定し、その中に QListWidget を作成して addItems() で文字列のリストを追加します。

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QListWidget, QVBoxLayout, QWidget

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QListWidget addItems() Basic Example (Python)")
        self.setGeometry(100, 100, 400, 300) # ウィンドウの位置とサイズ

        # QListWidgetのインスタンスを作成
        self.list_widget = QListWidget(self)

        # 追加するアイテムのリスト
        items_to_add = ["Apple", "Banana", "Cherry", "Date", "Elderberry", "Fig", "Grape"]

        # addItems() を使って複数のアイテムを一括で追加
        self.list_widget.addItems(items_to_add)

        # レイアウトの設定(QListWidgetをウィンドウの中心に配置)
        central_widget = QWidget()
        layout = QVBoxLayout(central_widget)
        layout.addWidget(self.list_widget)
        self.setCentralWidget(central_widget)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

解説

  1. QApplicationQMainWindow をインポートします。
  2. MainWindow クラスを作成し、そのコンストラクタでウィンドウを設定します。
  3. QListWidget(self) を使って QListWidget のインスタンスを作成し、親ウィジェットとして self (MainWindow) を指定します。
  4. items_to_add というPythonのリストに文字列を定義します。
  5. self.list_widget.addItems(items_to_add) を呼び出すことで、リスト内のすべての文字列が QListWidget に順に追加されます。
  6. QVBoxLayout を使用して QListWidget をメインウィンドウに配置し、表示します。

C++ (Qt) の例

C++では、QStringList を使用して文字列のリストを管理し、addItems() に渡します。

#include <QApplication>
#include <QMainWindow>
#include <QListWidget>
#include <QStringList> // QStringList を使うために必要
#include <QVBoxLayout>
#include <QWidget>

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

    QMainWindow window;
    window.setWindowTitle("QListWidget addItems() Basic Example (C++)");
    window.setGeometry(100, 100, 400, 300);

    // QListWidgetのインスタンスを作成
    QListWidget *listWidget = new QListWidget(&window);

    // 追加するアイテムのQStringListを作成
    QStringList itemsToAdd;
    itemsToAdd << "Apple" << "Banana" << "Cherry" << "Date" << "Elderberry" << "Fig" << "Grape";

    // addItems() を使って複数のアイテムを一括で追加
    listWidget->addItems(itemsToAdd);

    // レイアウトの設定(QListWidgetをウィンドウの中心に配置)
    QWidget *centralWidget = new QWidget(&window);
    QVBoxLayout *layout = new QVBoxLayout(centralWidget);
    layout->addWidget(listWidget);
    window.setCentralWidget(centralWidget);

    window.show();
    return app.exec();
}

解説

  1. 必要なヘッダーファイル(<QApplication>, <QMainWindow>, <QListWidget>, <QStringList>, <QVBoxLayout>, <QWidget>) をインクルードします。
  2. QListWidget のインスタンスをヒープに作成します(new QListWidget(&window))。
  3. QStringList itemsToAdd; を宣言し、<< オペレーターを使って文字列を追加します。
  4. listWidget->addItems(itemsToAdd); を呼び出して、リスト内のすべての文字列を QListWidget に追加します。
  5. Pythonの例と同様に、QVBoxLayout を使ってウィジェットを配置し、表示します。

動的にアイテムを追加する例

ユーザーの操作や外部データに応じて、後からaddItems()を使ってリストを更新するシナリオです。ここでは、ボタンをクリックすると新しいアイテムのセットが追加される例を示します。

Python (PyQt/PySide) の例

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QListWidget, QVBoxLayout, QWidget, QPushButton
from PyQt5.QtCore import Qt

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QListWidget addItems() Dynamic Example (Python)")
        self.setGeometry(100, 100, 400, 350)

        # QListWidgetのインスタンスを作成
        self.list_widget = QListWidget(self)

        # 初期アイテムの追加
        initial_items = ["Item A", "Item B"]
        self.list_widget.addItems(initial_items)

        # ボタンの作成
        self.add_button = QPushButton("Add More Items", self)
        self.add_button.clicked.connect(self.add_more_items) # ボタンクリックでメソッドを呼び出す

        # レイアウトの設定
        central_widget = QWidget()
        layout = QVBoxLayout(central_widget)
        layout.addWidget(self.list_widget)
        layout.addWidget(self.add_button)
        self.setCentralWidget(central_widget)

        self.counter = 1 # 追加するアイテムのカウンタ

    def add_more_items(self):
        """
        ボタンがクリックされたときに新しいアイテムを追加するスロット
        """
        new_items = [f"Dynamic Item {self.counter}-{i}" for i in range(1, 4)]
        self.list_widget.addItems(new_items)
        self.counter += 1
        print(f"Added: {new_items}") # デバッグ出力

if __name__ == "__main.py__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

解説

  1. QPushButton を追加し、その clicked シグナルを add_more_items スロットに接続します。
  2. add_more_items メソッド内で、新しい文字列のリストを動的に生成し、self.list_widget.addItems() を使って追加します。

C++ (Qt) の例

#include <QApplication>
#include <QMainWindow>
#include <QListWidget>
#include <QStringList>
#include <QVBoxLayout>
#include <QWidget>
#include <QPushButton> // QPushButton を使うために必要
#include <QDebug> // デバッグ出力のために必要

class MainWindow : public QMainWindow {
    Q_OBJECT // シグナルとスロットを使うために必要

public:
    MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
        setWindowTitle("QListWidget addItems() Dynamic Example (C++)");
        setGeometry(100, 100, 400, 350);

        listWidget = new QListWidget(this);
        listWidget->addItems({"Initial Item 1", "Initial Item 2"}); // 初期アイテム

        QPushButton *addButton = new QPushButton("Add More Items", this);
        // ボタンのclickedシグナルをaddMoreItemsスロットに接続
        connect(addButton, &QPushButton::clicked, this, &MainWindow::addMoreItems);

        QWidget *centralWidget = new QWidget(this);
        QVBoxLayout *layout = new QVBoxLayout(centralWidget);
        layout->addWidget(listWidget);
        layout->addWidget(addButton);
        setCentralWidget(centralWidget);

        counter = 1;
    }

private slots:
    void addMoreItems() {
        QStringList newItems;
        for (int i = 1; i <= 3; ++i) {
            newItems << QString("Dynamic Item %1-%2").arg(counter).arg(i);
        }
        listWidget->addItems(newItems);
        qDebug() << "Added:" << newItems; // デバッグ出力
        counter++;
    }

private:
    QListWidget *listWidget;
    int counter;
};

#include "main.moc" // Q_OBJECT マクロを使用する場合に必要 (mocが生成)

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    MainWindow window;
    window.show();
    return app.exec();
}
  1. Q_OBJECT マクロをクラス定義の先頭に追加し、シグナルとスロットのメカニズムを有効にします。
  2. QPushButton を作成し、その clicked() シグナルを addMoreItems() スロットに connect 関数で接続します。
  3. addMoreItems() スロットでは、QStringList に新しい文字列を生成し、listWidget->addItems() で追加します。
  4. C++の場合、Q_OBJECT を使用するクラスはmoc (Meta-Object Compiler) によって処理される必要があります。通常、これはビルドシステム(CMake, qmakeなど)が自動的に行いますが、手動で main.moc をインクルードすることもあります。


QListWidget::addItem(const QString &label) / QListWidget::addItem(QListWidgetItem *item)

これは、addItems() が複数のアイテムを一度に追加するのに対し、単一のアイテムを一つずつ追加する最も直接的な代替方法です。

特徴

  • 非効率性(大量の場合)
    非常に大量のアイテムを追加する場合、ループ内で addItem() を何度も呼び出すのは addItems() に比べて非効率的になることがあります。UIの更新が頻繁に発生し、処理が遅く感じられる可能性があります。
  • 柔軟性
    QListWidgetItem オブジェクトを直接渡す場合、アイコン、チェックボックス、カスタムデータなど、より詳細なプロパティを各アイテムに設定できます。
  • 単一アイテムの追加
    一度に一つの文字列、または一つの QListWidgetItem オブジェクトを追加します。

使用例

Python (PyQt/PySide)

from PyQt5.QtWidgets import QApplication, QMainWindow, QListWidget, QListWidgetItem, QVBoxLayout, QWidget
import sys

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("addItem() Example")
        self.setGeometry(100, 100, 300, 200)

        self.list_widget = QListWidget(self)

        # 文字列として追加
        self.list_widget.addItem("Orange")

        # QListWidgetItemとして追加 (より詳細な設定が可能)
        item = QListWidgetItem("Pineapple")
        item.setCheckState(Qt.Checked) # チェックボックスを付ける例
        self.list_widget.addItem(item)

        # ループで複数のアイテムを追加
        fruits = ["Mango", "Kiwi", "Lemon"]
        for fruit in fruits:
            self.list_widget.addItem(fruit)

        central_widget = QWidget()
        layout = QVBoxLayout(central_widget)
        layout.addWidget(self.list_widget)
        self.setCentralWidget(central_widget)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

C++ (Qt)

#include <QApplication>
#include <QMainWindow>
#include <QListWidget>
#include <QListWidgetItem> // QListWidgetItem を使うために必要
#include <QVBoxLayout>
#include <QWidget>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QMainWindow window;
    window.setWindowTitle("addItem() Example");
    window.setGeometry(100, 100, 300, 200);

    QListWidget *listWidget = new QListWidget(&window);

    // 文字列として追加
    listWidget->addItem("Orange");

    // QListWidgetItemとして追加 (より詳細な設定が可能)
    QListWidgetItem *item = new QListWidgetItem("Pineapple");
    item->setCheckState(Qt::Checked); // チェックボックスを付ける例
    listWidget->addItem(item);

    // ループで複数のアイテムを追加
    QStringList fruits;
    fruits << "Mango" << "Kiwi" << "Lemon";
    for (const QString &fruit : fruits) {
        listWidget->addItem(fruit);
    }

    QWidget *centralWidget = new QWidget(&window);
    QVBoxLayout *layout = new QVBoxLayout(centralWidget);
    layout->addWidget(listWidget);
    window.setCentralWidget(centralWidget);

    window.show();
    return app.exec();
}

モデル/ビューアーキテクチャ (QListView + QAbstractListModelのサブクラス)

QListWidget はシンプルで使いやすいですが、内部的には QListWidgetItem のリストを管理する独自のモデル(QStringListModel のプライベートなインスタンスに似たもの)を使用しています。

より複雑なデータ構造、大量のデータ、パフォーマンスの最適化、または異なるビュー(QTableViewQTreeView)で同じデータを表示したい場合は、Qt のモデル/ビュープログラミングを利用することが推奨されます。

このアプローチでは、QListView をビューとして使用し、カスタムデータモデル(QAbstractListModel を継承して作成)にデータを格納します。ビューはモデルから必要なデータのみを取得して表示するため、非常に効率的です。

特徴

  • 複雑性
    QListWidget に比べて設定が複雑になります。単純な文字列リストを表示するだけならオーバーキルになることもあります。
  • カスタムデリゲート
    アイテムの描画方法を細かく制御したい場合に、カスタムデリゲート (QStyledItemDelegate を継承) を使用できます。
  • 柔軟なデータ表示
    モデル内の任意のデータ(文字列、数値、カスタムオブジェクトなど)をビューに表示できます。data() メソッドと setData() メソッドをオーバーライドして、データの取得と設定方法を定義します。
  • 大量データへの対応
    仮想リストビューとして機能し、表示されている部分のデータのみをロードするため、数万、数百万といった大量のアイテムを扱う場合に非常に高いパフォーマンスを発揮します。
  • データと表示の分離
    データ(モデル)と表示(ビュー)が完全に分離されるため、コードの保守性が向上し、テストも容易になります。

使用例の概念 (Python / C++は非常に似ています)

# Python (PyQt/PySide) - 概念コード
from PyQt5.QtWidgets import QApplication, QListView, QMainWindow, QVBoxLayout, QWidget
from PyQt5.QtCore import QAbstractListModel, Qt, QModelIndex

class MyCustomModel(QAbstractListModel):
    def __init__(self, data=None, parent=None):
        super().__init__(parent)
        self._data = data or []

    def rowCount(self, parent=QModelIndex()):
        return len(self._data)

    def data(self, index, role=Qt.DisplayRole):
        if not index.isValid():
            return None
        if role == Qt.DisplayRole:
            return str(self._data[index.row()]) # リストの要素を文字列として返す
        # 他のロール(EditRole, DecorationRoleなど)も実装可能
        return None

    def add_items(self, new_items):
        # アイテムを追加する前にモデルに変更を通知
        self.beginInsertRows(QModelIndex(), self.rowCount(), self.rowCount() + len(new_items) - 1)
        self._data.extend(new_items)
        self.endInsertRows() # 変更完了を通知

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QListView + Custom Model Example")
        self.setGeometry(100, 100, 400, 300)

        self.list_view = QListView(self)
        initial_data = ["Model Item A", "Model Item B", "Model Item C"]
        self.model = MyCustomModel(initial_data)
        self.list_view.setModel(self.model)

        # addItems() の代わりにモデルのメソッドを呼び出す
        # モデルにデータを追加する
        self.model.add_items(["Model Item D", "Model Item E"])

        central_widget = QWidget()
        layout = QVBoxLayout(central_widget)
        layout.addWidget(self.list_view)
        self.setCentralWidget(central_widget)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

解説

  • QListView オブジェクトを作成し、setModel() メソッドでカスタムモデルを設定します。
  • add_items() メソッドは、モデル内部のデータを変更し、beginInsertRows()endInsertRows() を呼び出すことで、ビューにデータが追加されたことを通知します。これにより、ビューが自動的に更新されます。
  • data() メソッドで、ビューが特定のインデックスとロール(表示データ、編集データなど)に対応するデータを要求したときに、そのデータを返します。
  • rowCount() メソッドでリストのアイテム数を返します。
  • QAbstractListModel を継承して MyCustomModel を作成します。

データの型変換

QListWidget::addItems() は文字列のリストを期待するため、リスト内のデータが文字列以外の場合、表示されません。この場合、addItems() の前にデータを文字列に変換する必要があります。

特徴

  • シンプルさ
    複雑なモデルを作成する代わりに、簡単なデータ変換で対応できます。
  • 前処理
    addItems() を呼び出す前に、元のデータ(数値、カスタムオブジェクトなど)を適切な文字列形式に変換します。

使用例

Python (PyQt/PySide)

from PyQt5.QtWidgets import QApplication, QMainWindow, QListWidget, QVBoxLayout, QWidget
import sys

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Data Type Conversion Example")
        self.setGeometry(100, 100, 300, 200)

        self.list_widget = QListWidget(self)

        # 数値のリスト
        numbers = [100, 201, 305, 410]

        # 数値を文字列に変換してからaddItems()に渡す
        string_numbers = [str(num) for num in numbers]
        self.list_widget.addItems(string_numbers)

        # カスタムオブジェクトのリスト(例: Personオブジェクト)
        class Person:
            def __init__(self, name, age):
                self.name = name
                self.age = age
            def __str__(self): # print() や str() で呼ばれる
                return f"{self.name} ({self.age} years old)"

        people = [
            Person("Alice", 30),
            Person("Bob", 24),
            Person("Charlie", 35)
        ]

        # カスタムオブジェクトを文字列に変換
        string_people = [str(person) for person in people]
        self.list_widget.addItems(string_people)

        central_widget = QWidget()
        layout = QVBoxLayout(central_widget)
        layout.addWidget(self.list_widget)
        self.setCentralWidget(central_widget)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
#include <QApplication>
#include <QMainWindow>
#include <QListWidget>
#include <QStringList>
#include <QVBoxLayout>
#include <QWidget>
#include <QDebug> // デバッグ出力用

// カスタムクラスの例
class Person {
public:
    Person(const QString &name, int age) : m_name(name), m_age(age) {}
    QString toString() const { // QStringに変換するヘルパー関数
        return QString("%1 (%2 years old)").arg(m_name).arg(m_age);
    }
private:
    QString m_name;
    int m_age;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QMainWindow window;
    window.setWindowTitle("Data Type Conversion Example");
    window.setGeometry(100, 100, 300, 200);

    QListWidget *listWidget = new QListWidget(&window);

    // 数値のリスト
    QList<int> numbers = {100, 201, 305, 410};
    QStringList stringNumbers;
    for (int num : numbers) {
        stringNumbers << QString::number(num); // intをQStringに変換
    }
    listWidget->addItems(stringNumbers);

    // カスタムオブジェクトのリスト
    QList<Person> people;
    people.append(Person("Alice", 30));
    people.append(Person("Bob", 24));
    people.append(Person("Charlie", 35));

    QStringList stringPeople;
    for (const Person &p : people) {
        stringPeople << p.toString(); // カスタムオブジェクトをQStringに変換
    }
    listWidget->addItems(stringPeople);

    QWidget *centralWidget = new QWidget(&window);
    QVBoxLayout *layout = new QVBoxLayout(centralWidget);
    layout->addWidget(listWidget);
    window.setCentralWidget(centralWidget);

    window.show();
    return app.exec();
}