もう迷わない!QListWidget addItems()の代替手法:addItem()とモデル/ビュー徹底解説
QListWidget::addItems()
は、QtフレームワークにおけるGUIプログラミングで使用される QListWidget
クラスの非常に便利なメンバー関数です。
QListWidgetとは?
まず、QListWidget
について簡単に説明します。QListWidget
は、ユーザーがアイテム(項目)のリストを表示し、操作できるウィジェットです。ファイルリスト、選択可能なオプションのリストなど、様々な場面で利用されます。各アイテムは QListWidgetItem
オブジェクトとして管理されます。
addItems()の機能
QListWidget::addItems()
メソッドは、複数の文字列を一度に QListWidget
に追加するために使用されます。通常、PythonやC++などのプログラミング言語では、文字列のリスト(例えば QStringList
や list 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);
- Python例
- 渡しているリストの内容を確認
デバッグ出力(qDebug()
/print()
)を使って、addItems()
に渡すリストが期待通りの内容(文字列のみで、空ではない)になっているか確認します。
アプリケーションがクラッシュする、またはエラーが発生する
考えられる原因
- 異なるスレッドからのアクセス
GUI操作(QListWidget
の更新など)はメインスレッドで行われる必要があります。別のスレッドからaddItems()
を呼び出そうとすると、クラッシュや予期せぬ動作につながることがあります。 - 無効なポインタ(C++のみ)
QListWidget
のインスタンスがNULLポインタであるか、すでに解放されたオブジェクトに対してaddItems()
を呼び出そうとしている可能性があります。
トラブルシューティング
- スレッドセーフな更新
他のスレッドからQListWidget
を更新する必要がある場合は、シグナルとスロットのメカニズムを使用して、メインスレッドに処理を委譲します。- メインスレッドでスロットを作成し、そのスロット内で
addItems()
を呼び出すようにします。 - 他のスレッドからは、このスロットに接続されたシグナルを発行します。
- メインスレッドでスロットを作成し、そのスロット内で
- C++でのポインタ確認
QListWidget
オブジェクトを操作する前に、ポインタが有効であることを確認します(例:if (myListWidget)
)。new
で生成した場合は、delete
されるまで有効です。
追加されたアイテムの順序が期待と異なる
考えられる原因
- 渡したリストの順序が間違っている
addItems()
は渡されたリストの要素の順序をそのまま保持します。もし順序が違うなら、それは渡す前のリストの段階で間違っている可能性があります。
トラブルシューティング
- ソースデータの確認
addItems()
に渡す前の元のリスト(QStringList
やlist
)の順序が正しいかを確認します。必要に応じて、事前にソートなどの処理を行います。
パフォーマンスの問題(大量のアイテムを追加する場合)
考えられる原因
- 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) の例
この例では、基本的な QApplication
と QMainWindow
を設定し、その中に 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_())
解説
QApplication
とQMainWindow
をインポートします。MainWindow
クラスを作成し、そのコンストラクタでウィンドウを設定します。QListWidget(self)
を使ってQListWidget
のインスタンスを作成し、親ウィジェットとしてself
(MainWindow) を指定します。items_to_add
というPythonのリストに文字列を定義します。self.list_widget.addItems(items_to_add)
を呼び出すことで、リスト内のすべての文字列がQListWidget
に順に追加されます。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();
}
解説
- 必要なヘッダーファイル(
<QApplication>
,<QMainWindow>
,<QListWidget>
,<QStringList>
,<QVBoxLayout>
,<QWidget>
) をインクルードします。 QListWidget
のインスタンスをヒープに作成します(new QListWidget(&window)
)。QStringList itemsToAdd;
を宣言し、<<
オペレーターを使って文字列を追加します。listWidget->addItems(itemsToAdd);
を呼び出して、リスト内のすべての文字列をQListWidget
に追加します。- 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_())
解説
QPushButton
を追加し、そのclicked
シグナルをadd_more_items
スロットに接続します。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();
}
Q_OBJECT
マクロをクラス定義の先頭に追加し、シグナルとスロットのメカニズムを有効にします。QPushButton
を作成し、そのclicked()
シグナルをaddMoreItems()
スロットにconnect
関数で接続します。addMoreItems()
スロットでは、QStringList
に新しい文字列を生成し、listWidget->addItems()
で追加します。- 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
のプライベートなインスタンスに似たもの)を使用しています。
より複雑なデータ構造、大量のデータ、パフォーマンスの最適化、または異なるビュー(QTableView
や QTreeView
)で同じデータを表示したい場合は、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();
}