PySide6でツリービューのサンプル【QTreeView】

python コンピュータ
python

ツリービューとリストビューでファイルマネージャーぽくフォルダを移動するサンプルプログラムです。

import sys
import os
from PySide6.QtWidgets import (QApplication, QWidget, QHBoxLayout, QVBoxLayout,
                             QTreeView, QListView, QFileSystemModel)
from PySide6.QtCore import QDir, QModelIndex

class FileBrowser(QWidget):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("ファイルブラウザ")

        self.setGeometry(0, 0, 640, 400)

        # モデルの作成
        self.model = QFileSystemModel()
        self.model.setRootPath(QDir.homePath())  # ホームディレクトリをルートに設定

        # TreeViewの作成
        self.tree_view = QTreeView()
        self.tree_view.setModel(self.model)
        self.tree_view.setRootIndex(self.model.index(QDir.homePath())) # ホームディレクトリを表示
        self.tree_view.clicked.connect(self.tree_view_clicked) # クリックしたときに呼び出す関数

        # ListViewの作成
        self.list_view = QListView()
        self.list_view.setModel(self.model)
        self.list_view.setRootIndex(self.model.index(QDir.homePath())) # ホームディレクトリを表示

        # レイアウト
        h_layout = QHBoxLayout()
        h_layout.addWidget(self.tree_view)
        h_layout.addWidget(self.list_view)

        v_layout = QVBoxLayout()
        v_layout.addLayout(h_layout)

        self.setLayout(v_layout)

    def tree_view_clicked(self, index):
        # TreeViewで選択されたディレクトリのパスを取得
        path = self.model.filePath(index)

        if os.path.isdir(path): # フォルダのときだけ処理を行う
            # ListViewのルートパスを変更
            self.list_view.setRootIndex(self.model.index(path))

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = FileBrowser()
    window.show()
    sys.exit(app.exec())

左側のツリービューでフォルダを選択すると、右側のリストビューも連動します。

 

ListViewでも感じましたが、ファイルマネージャを作るための部品など具体的なパーツが用意してあり、それらを組み合わせるとそこそこリッチな操作性を持つUIが作れそうです。細かな制御が出来るかは不明ですが、そのあたり拘らなければプログラム開発の生産性が向上しそうです。

 

コメント