PySide Model/View【第3弾】シンプルなリスト表示!QListView + QStringListModel

\ 迷ったらまずTechAcademyの無料カウンセリング! /

前回の記事では、階層データを扱う QTreeView + QStandardItemModel を解説しました。
今回はもっとシンプルに「リスト表示」を作れる QListView + QStringListModel を紹介します。

この組み合わせは、文字列の一覧をGUIに出すときに最適で、例えば「TODOリスト」や「メニュー一覧」などに活用できます。
まずは最も基本的なコードから見ていきましょう。

目次

QListView + QStringListModelとは?

  • QListView … 1列のリストを表示するビュー。
  • QStringListModel … Python のリストに似た「文字列リスト」をモデルとして管理するクラス。

この2つを組み合わせることで「リストに文字列を表示・編集」できます。
「文字列だけをリスト化する」用途では一番高速で、データバインディングの仕組みを理解する入門にも最適です。

基本コード

from PySide6.QtWidgets import QApplication, QListView, QMainWindow
from PySide6.QtCore import QStringListModel
import sys

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QListView + QStringListModel")

        # データ(Pythonリスト)
        items = ["りんご", "みかん", "バナナ", "ぶどう"]

        # モデルを作成
        self.model = QStringListModel()
        self.model.setStringList(items)

        # ビューを作成
        self.view = QListView()
        self.view.setModel(self.model)

        self.setCentralWidget(self.view)

app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())

主なプロパティとメソッド一覧(全解説)

Noメソッド / プロパティ説明
1setStringList(list)Pythonリストから文字列リストを設定するmodel.setStringList(["A", "B"])
2stringList()現在の文字列リストを取得するprint(model.stringList())
3insertRows(row, count)指定位置に行を挿入するmodel.insertRows(1, 2)
4removeRows(row, count)指定位置から行を削除するmodel.removeRows(0, 1)
5setData(index, value)指定した行の値を変更するmodel.setData(model.index(0), "新しい値")
6data(index)指定した行の値を取得するprint(model.data(model.index(0)))
7rowCount()行数を取得するprint(model.rowCount())
8flags(index)編集可・選択可などのフラグを確認するprint(model.flags(model.index(0)))

各プロパティ・メソッド 詳細解説

【1】文字列リストを設定

概要: Pythonのリストから文字列リストを設定します。
メソッドsetStringList(list)
使い方

self.model.setStringList(["赤", "青", "緑"])

【2】文字列リストを取得

概要: 現在の文字列リストを取得します。
メソッドstringList()
使い方

print(self.model.stringList())
# ["赤", "青", "緑"]

【3】行を追加

概要: 指定した位置に新しい行を追加します。
メソッドinsertRows(row, count)
使い方

self.model.insertRows(1, 2)  # 1行目から2行追加

【4】行を削除

概要: 指定した位置から行を削除します。
メソッドremoveRows(row, count)
使い方

self.model.removeRows(0, 1)  # 先頭行を削除

【5】行のデータ変更

概要: 指定した行のデータを変更します。
メソッドsetData(index, value)
使い方

idx = self.model.index(0)
self.model.setData(idx, "変更後の文字列")

【6】行のデータ取得

概要: 指定した行のデータを取得します。
メソッドdata(index)
使い方

idx = self.model.index(0)
print(self.model.data(idx))
# 変更後の文字列

【7】行数を取得

概要: 行数を取得します。
メソッドrowCount()
使い方

print(model.rowCount())
# 4

【8】行が編集可能かどうか

概要: 行が編集可能かどうかなどの情報を取得します。
メソッドflags(index)
使い方

idx = self.model.index(0)
print(self.model.flags(idx))
# ItemFlag.ItemIsSelectable|ItemIsEditable|ItemIsDragEnabled|ItemIsDropEnabled|ItemIsEnabled|ItemNeverHasChildren

応用編:もっと便利に使うQListView + QStringListModel

QListView は単純に文字列を並べるだけでなく、ちょっとした工夫で「検索機能」や「チェック付きリスト」にすることもできます。

  • 検索機能を付けると、大量のリストからでも欲しい項目をすぐ探せます。
  • チェック付きリストを作れば、選択やTODO管理に役立ちます。
  • アイコン付きリストを使うと、ユーザーに直感的で楽しいUIを提供できます。

つまり、QListView はシンプルでありながら、工夫次第で 検索・選択・装飾 など柔軟に拡張できるのが魅力です。

🔍 検索ボックス付きリスト

リストが長くなってくると「検索」があると便利です。
QLineEdit と組み合わせて、入力した文字でフィルタリングしてみましょう。

from PySide6.QtWidgets import QApplication, QMainWindow, QListView, QLineEdit, QVBoxLayout, QWidget
from PySide6.QtCore import QStringListModel
import sys

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("検索付き QListView")

        # 元データ
        self.items = ["りんご", "みかん", "バナナ", "ぶどう", "パイナップル", "メロン"]

        # モデル
        self.model = QStringListModel(self.items)

        # ビュー
        self.view = QListView()
        self.view.setModel(self.model)

        # 検索ボックス
        self.search = QLineEdit()
        self.search.setPlaceholderText("ここに文字を入力すると検索できます")
        self.search.textChanged.connect(self.filter_list)

        # レイアウト
        layout = QVBoxLayout()
        layout.addWidget(self.search)
        layout.addWidget(self.view)

        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

    def filter_list(self, text):
        if text:
            filtered = [item for item in self.items if text in item]
        else:
            filtered = self.items
        self.model.setStringList(filtered)

app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())

入力した文字に応じて、リストがリアルタイムで絞り込みされます。

✅ チェック付きリスト(QStandardItemModelを活用)

QStringListModel ではチェック機能は直接使えませんが、
QStandardItemModel に切り替えると簡単に「チェックボックス付きリスト」が作れます。

from PySide6.QtWidgets import QApplication, QMainWindow, QListView
from PySide6.QtGui import QStandardItemModel, QStandardItem
import sys

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("チェック付き QListView")

        # モデル
        self.model = QStandardItemModel()

        # データを追加(チェック可能にする)
        for fruit in ["りんご", "みかん", "バナナ", "ぶどう"]:
            item = QStandardItem(fruit)
            item.setCheckable(True)
            self.model.appendRow(item)

        # ビュー
        self.view = QListView()
        self.view.setModel(self.model)

        self.setCentralWidget(self.view)

app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())

チェック付きのリストを作れるので、
「選択されたアイテムを取得する」「TODOリスト」などにすぐ応用できます。

🎨 スタイルを変える(アイコン付きリスト)

QListView は文字列だけでなく、アイコンも一緒に表示できます。

from PySide6.QtWidgets import QApplication, QMainWindow, QListView
from PySide6.QtGui import QStandardItemModel, QStandardItem, QIcon
import sys

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("アイコン付き QListView")

        # モデル
        self.model = QStandardItemModel()

        # アイテム(アイコン付き)
        fruits = [("りんご", "🍎"), ("みかん", "🍊"), ("バナナ", "🍌")]
        for name, emoji in fruits:
            item = QStandardItem(f"{emoji} {name}")
            self.model.appendRow(item)

        # ビュー
        self.view = QListView()
        self.view.setModel(self.model)

        self.setCentralWidget(self.view)

app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())

文字だけでなく絵文字や画像を使うと、リストがぐっと見やすくなります。

よくある質問(FAQ)

QListWidget と QListView の違いは?

QListWidget は「リスト専用の便利クラス」で内部的にモデルを持っています。
QListView は「ビュー専用クラス」で、モデルを自分で用意(今回の QStringListModel など)します。
柔軟さを求めるなら QListView。手軽さなら QListWidget。

編集できないようにするには?

self.view.setEditTriggers(QListView.NoEditTriggers)

ダブルクリックでイベントを処理したい

self.view.doubleClicked.connect(lambda idx: print(model.data(idx)))

リストの内容を更新したいときは?

setStringList() を呼び直すか、setData() で個別に更新します。

文字列以外のデータは扱えないの?

QStringListModel は文字列専用です。複雑なデータを扱う場合は QStandardItemModel や独自モデルを使います。

まとめ

QListView + QStringListModel は、Model/View の中でいちばんシンプルでわかりやすい組み合わせです。
たった一行の setStringList() でリスト表示が作れるので、初めて触れる人でもすぐに動かせます。

「リストに文字を入れて表示する」「項目を選ぶ」「編集や削除をする」など、
アプリでよく使う操作を自然に学べるのもポイントです。

もし文字列だけでは物足りなくなったら、次は QStandardItemModel に進むのがおすすめです。
チェックボックスやアイコンを付けたり、もっと自由な操作ができるようになります。

最初はこのシンプルなリストから始めて、慣れてきたら TableView → TreeView → カスタムモデル へと少しずつステップアップしていくと、Model/View の世界がぐっと楽しく、そして理解しやすくなりますよ。
デザインをより現代風にかっこよくするには次の記事を参考にしてください

シェアしてくださると嬉しいです!
  • URLをコピーしました!

コメント

コメントする

目次