2022-03-24

PySide6: チェックボックス付きの QTreeView

PySide (Qt for Python) は、Qt(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。配布ライセンスは LGPL で公開されています。最新のバージョンは Qt6 に対応した PySide6(記事執筆時点で 6.2.3)です。

今回は、出来合いの QStandardItemModel を使って、QTreeView に表示するチェックボックス付きのツリー構造のサンプルを紹介します。

下記の OS 環境で動作確認をしました。

Fedora Silverblue 35 x86_64
Python 3.10.3
PySide6 6.2.3
qt_treeview_check.py
#!/usr/bin/env python
# coding: utf-8
import sys
from PySide6.QtCore import Qt
from PySide6.QtGui import QStandardItemModel, QStandardItem
from PySide6.QtWidgets import (
QApplication,
QMainWindow,
QTreeView,
)
class Example(QMainWindow):
pref = {
'北海道': '札幌市', '青森県': '青森市', '岩手県': '盛岡市', '宮城県': '仙台市', '秋田県': '秋田市',
'山形県': '山形市', '福島県': '福島市', '茨城県': '水戸市', '栃木県': '宇都宮市', '群馬県': '前橋市',
'埼玉県': 'さいたま市', '千葉県': '千葉市', '東京都': '新宿区', '神奈川県': '横浜市', '新潟県': '新潟市',
'富山県': '富山市', '石川県': '金沢市', '福井県': '福井市', '山梨県': '甲府市', '長野県': '長野市',
'岐阜県': '岐阜市', '静岡県': '静岡市', '愛知県': '名古屋市', '三重県': '津市', '滋賀県': '大津市',
'京都府': '京都市', '大阪府': '大阪市', '兵庫県': '神戸市', '奈良県': '奈良市', '和歌山県': '和歌山市',
'鳥取県': '鳥取市', '島根県': '松江市', '岡山県': '岡山市', '広島県': '広島市', '山口県': '山口市',
'徳島県': '徳島市', '香川県': '高松市', '愛媛県': '松山市', '高知県': '高知市', '福岡県': '福岡市',
'佐賀県': '佐賀市', '長崎県': '長崎市', '熊本県': '熊本市', '大分県': '大分市', '宮崎県': '宮崎市',
'鹿児島県': '鹿児島市', '沖縄県': '那覇市',
}
def __init__(self):
super().__init__()
self.init_ui()
self.setWindowTitle('TreeView with check')
def init_ui(self):
tree = QTreeView()
self.setCentralWidget(tree)
model = QStandardItemModel()
model.setHorizontalHeaderLabels(['都道府県', '庁所在地'])
for name_pref in self.pref.keys():
item_pref = QStandardItem(name_pref)
item_pref.setCheckable(True)
item_pref.setEditable(False)
item_capital = QStandardItem(self.pref[name_pref])
item_capital.setCheckable(True)
item_capital.setEditable(False)
model.appendRow([item_pref, item_capital])
tree.setModel(model)
model.itemChanged.connect(self.on_check_item)
def on_check_item(self, item: QStandardItem):
row = item.row()
name = item.text()
if item.checkState() == Qt.CheckState.Checked:
msg = 'checked'
is_checked = True
else:
msg = 'unchecked'
is_checked = False
print(row, name, msg)
def main():
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec())
if __name__ == '__main__':
main()
qt_treeview_check.py の実行例

チェックボックスの表示を強調してしまったために、ちっともツリー構造らしくないのですが、チェックすることで下記のように出力されます。

0 北海道 checked
1 青森県 checked
0 札幌市 checked
1 青森市 checked
1 青森市 unchecked

参考サイト

  1. QTreeView — Qt for Python
  2. QStandardItemModel — Qt for Python
  3. QStandardItem — Qt for Python

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ Linuxへ
にほんブログ村

0 件のコメント: