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 を使う | アルトエリア++
いいなと思ったら応援しよう!
Note やるからには、サポートがいただけるような役立つ記事を書きたいものです。サポートは資料購入に宛てます。