
目次
前回、PySide2 でツリービューやリストビューを使う例として、PySide2 の QTreeView / QListView でディレクトリを表示する を書きました。今回は、単純に文字列リストをリストやコンボボックスで表示する例を紹介します。
はじめに
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())
表示してみます。