takuroooのブログ

勉強したこととか

QTreeWidgetの基本的なこと

最近仕事で処理結果をGUIで表示させたいことがあったのでPythonのQtを勉強してみた。

PythonのQtにはPyQtとQt for Python(PySide2)があるけど、今回は最近登場したQt for Python(PySide2)を使って簡単なTree構造の作り方をまとめてみようと思う。

Qt for Pythonは以下のコマンドでインストールできる。

pip install pyside2

Qt for Python公式ページ www.qt.io

目次

TreeのベースとなるWindowを表示する

f:id:takuroooooo:20200112105606p:plain

import sys
from PySide2.QtWidgets import QApplication, QTreeWidget

app = QApplication(sys.argv)

qw_tree = QTreeWidget()
qw_tree.show()

sys.exit(app.exec_())

基本的なこと

  • QtではWidgetと呼ばれる部品を使うことで色々なGUIを作ることができる。
  • QApplication()Widget関連の初期化をするので、Widgetを使う前に実行しなければならない。
  • QTreeWidget()はツリー形式のGUIを作るためのWidget
  • Widgetを表示するためには、show()を実行する。show()は全てのWidgetが持つメソッド。
  • sys.exit(app.exec_())でQtのメインループに入る。

ということで、GUIを作るためにはQApplication()sys.exit(app.exec_())の間で

  1. 必要なWidgetを定義
  2. Widgetのメソッドであるshow()を実行

が必要になる。

TreeにHeaderをつける

f:id:takuroooooo:20200112114557p:plain

import sys
from PySide2.QtWidgets import QApplication, QTreeWidget

app = QApplication(sys.argv)

qw_tree = QTreeWidget()
qw_tree.setHeaderLabels(["name", "tel", "mail"])  # Headerをつける
qw_tree.show()

sys.exit(app.exec_())

QTreeWidget.setHeaderLabels(labels)

  • リスト形式の変数を渡すとヘッダを生成してくれる。
  • 同様にヘッダを生成することができるメソッドにQTreeWidget.setHeaderItem()QTreeWidget.setHeaderLabel()があるが、できることは一緒なのでsetHeaderLabels()を使っておけばOK。

TreeにItemを追加する

f:id:takuroooooo:20200112120235p:plain

import sys
from PySide2.QtWidgets import QApplication, QTreeWidget, QTreeWidgetItem

app = QApplication(sys.argv)

qw_tree = QTreeWidget()
qw_tree.setHeaderLabels(["name", "tel", "mail"])
qw_tree_parent_item = QTreeWidgetItem(['family'])  # Treeに追加するItemを生成
qw_tree.addTopLevelItem(qw_tree_parent_item)  # TreeにItemを追加する
qw_tree.show()

sys.exit(app.exec_())

QTreeWidgetItem(names)

  • list形式の変数を渡すとTreeに追加するItemを生成してくれる。
  • QTreeWidget.addTopLevelItem()に生成したItemを設定すると、TreeにItemが登録される。
  • QTreeWidget.addTopLevelItems()を使うと複数Itemをリスト形式で渡すことができる。

Itemに子Itemを追加する

f:id:takuroooooo:20200112121225p:plain

import sys
from PySide2.QtWidgets import QApplication, QTreeWidget, QTreeWidgetItem

app = QApplication(sys.argv)

qw_tree = QTreeWidget()
qw_tree.setHeaderLabels(["name", "tel", "mail"])
qw_tree_parent_item = QTreeWidgetItem(['family'])
qw_tree_parent_item.addChild(QTreeWidgetItem(['A', '111-111-111', 'aaa@gmail.com']))  # Itemに子Itemを追加
qw_tree.addTopLevelItem(qw_tree_parent_item)
qw_tree.expandAll()  # TreeのItemを全て開く
qw_tree.show()

sys.exit(app.exec_())

QTreeWidgetItem.addChild(Item)

  • QTreeWidgetItem.addChild(Item)を使うとItemに子Itemを追加できる。
  • QTreeWidget.expandAll()を使うとデフォルトでTreeが開いた状態になる。
  • QTreeWidget.expandAll()QTreeWidgetItem.addChild(Item)の後に呼ぶ。

Treeに複数のItemをつける

これまでやってきたことを繰り返すだけで簡単に階層構造のTree GUIが作れる。

f:id:takuroooooo:20200112122553p:plain

import sys
from PySide2.QtWidgets import QApplication, QTreeWidget, QTreeWidgetItem

app = QApplication(sys.argv)

qw_tree = QTreeWidget()
qw_tree.setHeaderLabels(["name", "tel", "mail"])

qw_tree_parent_item_1 = QTreeWidgetItem(['family'])
qw_tree_parent_item_1.addChild(QTreeWidgetItem(['A', '111-111-111', 'aaa@gmail.com']))
qw_tree_parent_item_1.addChild(QTreeWidgetItem(['B', '222-222-222', 'bbb@gmail.com']))

qw_tree_parent_item_2 = QTreeWidgetItem(['school'])
qw_tree_parent_item_2.addChild(QTreeWidgetItem(['C', '333-333-333', 'ccc@gmail.com']))
qw_tree_parent_item_2.addChild(QTreeWidgetItem(['D', '444-444-444', 'ddd@gmail.com']))

qw_tree.addTopLevelItem(qw_tree_parent_item_1)
qw_tree.addTopLevelItem(qw_tree_parent_item_2)
qw_tree.expandAll()
qw_tree.show()

sys.exit(app.exec_())

ソースコード

github.com