ツリービューとリストビューでファイルマネージャーぽくフォルダを移動するサンプルプログラムです。
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が作れそうです。細かな制御が出来るかは不明ですが、そのあたり拘らなければプログラム開発の生産性が向上しそうです。
コメント