Qt(PySide/PyQt)で、めっちゃ便利だけど、ちょっと難しい「Model/View」。「QStandardItemModel」でも作れないことはないですが、ファイルの一覧などを表示するのにめっちゃ便利なのが「QFileSystemModel」です!
今回は、簡単に「MA/MBファイル」だけを表示する例をご紹介したいと思います!(`・ω・´)ゞ
QFileSystemModel.setFilter
「setFilter」は、Viewで表示する内容を、フォルダだけ、ファイルだけなど簡単にフィルタリングすることができます。今回は、「MA/MBファイル」だけにしたいので、ファイルだけ表示するように設定します。
from PySide import QtCore, QtGui class MainWindow(QtGui.QWidget): def __init__(self, *args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) model = QtGui.QFileSystemModel(self) model.setFilter(QtCore.QDir.Files)
QFileSystemModel.setNameFilters
「setNameFilters」は、ワイルドカードと併用することで、特定のファイル名を持つものだけを表示できるようになります。MAファイルは「*.ma」MBファイルは「*mb」でフィルタリングすることができます(*´ω`*)b
from PySide import QtCore, QtGui class MainWindow(QtGui.QWidget): def __init__(self, *args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) model = QtGui.QFileSystemModel(self) model.setFilter(QtCore.QDir.Files) model.setNameFilters(['*.ma', '*.mb'])
QFileSystemModel.setNameFilterDisables
「setNameFilterDisables」は、「setNameFilters」で一致しなかった内容を表示するかどうかの設定です。一致しなかったものはグレーで表示されてしまうので、OFFに設定するようにします。
from PySide import QtCore, QtGui class MainWindow(QtGui.QWidget): def __init__(self, *args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) model = QtGui.QFileSystemModel(self) model.setFilter(QtCore.QDir.Files) model.setNameFilters(['*.ma', '*.mb']) model.setNameFilterDisables(False)
QFileSystemModel.setRootPath
表示する場所を指定したい場合は、「setRootPath」を設定します。ここでは、Mayaのサンプルファイルがある場所に設定します。
from PySide import QtCore, QtGui class MainWindow(QtGui.QWidget): def __init__(self, *args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) model = QtGui.QFileSystemModel(self) model.setFilter(QtCore.QDir.Files) model.setNameFilters(['*.ma', '*.mb']) model.setNameFilterDisables(False) index = model.setRootPath('C:/Program Files/Autodesk/Maya2016.5/Examples/Modeling/Sculpting_Base_Meshes/Animals')
Viewの用意
今回は、ヘッダが表示できる「QTreeView」を使用します!合わせて、モデルの設定、表示位置の設定も済ませてしまいます!
from PySide import QtCore, QtGui class MainWindow(QtGui.QWidget): def __init__(self, *args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) model = QtGui.QFileSystemModel(self) model.setFilter(QtCore.QDir.Files) model.setNameFilters(['*.ma', '*.mb']) model.setNameFilterDisables(False) index = model.setRootPath('C:/Program Files/Autodesk/Maya2016.5/Examples/Modeling/Sculpting_Base_Meshes/Animals') mainLayout = QtGui.QVBoxLayout(self) view = QtGui.QTreeView(self) view.setModel(model) view.setRootIndex(index) mainLayout.addWidget(view)
実験!
早速ウインドウを表示してみると、以下のようになります!(`・ω・´)ゞ
「QFileSystemModel」で作ると、もしファイルが削除されたり、リネームされてもViewに表示される内容が勝手に更新してくれるので便利です!