QFileSystemModelで特定の拡張子だけ表示する方法!!




takkun
どうも!たっくんです!

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にもsetRootIndexという設定があるので、setRootPathの戻り値を変数に代入しておきましょう!

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に表示される内容が勝手に更新してくれるので便利です!