見出し画像

PySide2 の QListView / QComboBox を使う

はじめに
Model / View を使ってリスト等を表示する場合、モデルを準備する作業が必要です。ただし、単純なデータについては、前回の記事で利用した QFileSystemModel のように予めモデルが用意がされています。今回は、文字列リストを取り扱うための QStringListModel を利用して、リストやコンボボックスを表示します。

QStringListModel を使う
QStringListModel は、QListView や QComboBox で利用できる編集可能な文字列リストモデルを提供します。文字列を割り当てるには、setStringList メソッドを使います。

※ Qt では文字列を QString、文字列リストを QStringList で扱いますが、PySide2 では、単純に Python の文字列型 (string) とそのリスト型 (list) を使います。

model = QStringListModel()
model.setStringList(str_list)

QListView で文字列リストを表示する
それでは、実際に文字列リストをリストビューで表示してみます。

import sys
from PySide2.QtCore import Qt
from PySide2.QtCore import QStringListModel
from PySide2.QtWidgets import QApplication
from PySide2.QtWidgets import QListView

def main():
    app = QApplication(sys.argv)

    # PySide では QString, QStringList ではなく、文字列とそのリストを直接使う
    slist = ['時計', 'テレビ', 'パソコン', '電話']
    model = QStringListModel()
    model.setStringList(slist)

    view = QListView()
    view.setModel(model)
    view.show()

    return app.exec_()

if __name__ == '__main__':
sys.exit(main())

上記を実行してみます。

QComboBox で文字列リストを表示する
次に同じモデルをコンボボックスで表示してみます。上記コードの QListView を QConboBox に書き換えるだけです。

import sys
from PySide2.QtCore import Qt
from PySide2.QtCore import QStringListModel
from PySide2.QtWidgets import QApplication
from PySide2.QtWidgets import QComboBox

def main():
    app = QApplication(sys.argv)

    # PySide では QString, QStringList ではなく、文字列とそのリストを直接使う
    slist = ['時計', 'テレビ', 'パソコン', '電話']
    model = QStringListModel()
    model.setStringList(slist)

    view = QComboBox()
    view.setModel(model)
    view.show()

    return app.exec_()

if __name__ == '__main__':
    sys.exit(main())

実行してみます。下段は、コンボボックスを開いたところです。

おまけ
リストとコンボボックスを比較できるように、上下に並べて表示してみました。

import sys
from PySide2.QtCore import Qt
from PySide2.QtCore import QStringListModel
from PySide2.QtWidgets import QApplication
from PySide2.QtWidgets import QSplitter
from PySide2.QtWidgets import QListView
from PySide2.QtWidgets import QComboBox

def main():
    app = QApplication(sys.argv)

    # PySide では QString, QStringList ではなく、Python の組込型を直接使う
    slist = ['時計', 'テレビ', 'パソコン', '電話']
    model = QStringListModel()
    model.setStringList(slist)

    # 2つのビューを分けるために QSplitter を使う (垂直分割)
    splitter = QSplitter()
    splitter.setOrientation(Qt.Vertical)

    # リストビュー
    view1 = QListView(splitter)
    view1.setModel(model)

    # コンボボックス
    view2 = QComboBox(splitter)
    view2.setModel(model)

    splitter.show()

    return app.exec_()

if __name__ == '__main__':
    sys.exit(main())

表示してみます。

この記事は、下記にも記載しています。
PySide2 の QListView / QComboBox を使う | アルトエリア++

参考
PySide2 の QTreeView / QListView でディレクトリを表示する | アルトエリア++

Note やるからには、サポートがいただけるような役立つ記事を書きたいものです。サポートは資料購入に宛てます。