2013-03-12 21 views
6

QDirModel(またはQFileSystemModel)を使ってシンプルなQTreeView()を使ってファイル/フォルダを表示する方法を知っていますが、それぞれの隣にチェックボックスを追加したいユーザは自分のシステム上のいくつかのフォルダ/ファイルを選択することができる。明らかに、私は彼がどれを選んだのかも知る必要があります。何かヒント?PyQt4ローカルディレクトリビューでフォルダを選択するオプション

基本的にこのような何か...以下

enter image description here

は、ディレクトリビューを行いますが、チェックボックスのないサンプルコードです。

from PyQt4 import QtGui 

if __name__ == '__main__': 

    import sys 

    app = QtGui.QApplication(sys.argv) 

    model = QtGui.QDirModel() 
    tree = QtGui.QTreeView() 
    tree.setModel(model) 

    tree.setAnimated(False) 
    tree.setIndentation(20) 
    tree.setSortingEnabled(True) 

    tree.setWindowTitle("Dir View") 
    tree.resize(640, 480) 
    tree.show() 

    sys.exit(app.exec_()) 

答えて

5

あなたはQDirModelをサブクラス化し、roleQtCore.Qt.CheckStateRoleある場合は、チェックすべきdata(index,role)方法を、再実装することができます。そうであれば、QtCore.Qt.CheckedまたはQtCore.Qt.Uncheckedのいずれかを返す必要があります。また、setDataメソッドを再実装して、ユーザーのチェック/チェック解除を処理し、flagsをQtCore.Qt.ItemIsUserCheckableフラグを返す必要があります。これにより、ユーザーのチェック/チェックを解除できます。すなわち:

class CheckableDirModel(QtGui.QDirModel): 
def __init__(self, parent=None): 
    QtGui.QDirModel.__init__(self, None) 
    self.checks = {} 

def data(self, index, role=QtCore.Qt.DisplayRole): 
    if role != QtCore.Qt.CheckStateRole: 
     return QtGui.QDirModel.data(self, index, role) 
    else: 
     if index.column() == 0: 
      return self.checkState(index) 

def flags(self, index): 
    return QtGui.QDirModel.flags(self, index) | QtCore.Qt.ItemIsUserCheckable 

def checkState(self, index): 
    if index in self.checks: 
     return self.checks[index] 
    else: 
     return QtCore.Qt.Unchecked 

def setData(self, index, value, role): 
    if (role == QtCore.Qt.CheckStateRole and index.column() == 0): 
     self.checks[index] = value 
     self.emit(QtCore.SIGNAL("dataChanged(QModelIndex,QModelIndex)"), index, index) 
     return True 

    return QtGui.QDirModel.setData(self, index, value, role) 

その後、あなたの代わりにQDirModelのこのクラスを使用します。

model = CheckableDirModel() 
tree = QtGui.QTreeView() 
tree.setModel(model) 
+0

これはうまく動作しますが、あなたは1がC上でクリックしたときにそれを修正する方法を知っていますか:すべてのサブカテゴリをクリックしてときます1つはサブカテゴリをクリックしたC:ドットになる(ハーフチェック)? – Kiarash

+0

@Kiarashそれに応じて、 'setData'の' index'の子インデックスと親インデックスを変更する必要があります。子インデックスを取得するには、 'QModelIndex.child'を使います。親インデックスを取得するには、 'QModelIndex.parent'を使用します。与えられたインデックスの子をたくさん取得するには 'QDirModel.rowCount'を使うべきです。 [this](http://pyqt.sourceforge.net/Docs/PyQt4/qmodelindex.html)と[this](http://pyqt.sourceforge.net/Docs/PyQt4/qabstractitemmodel.html#rowCount) – user2155932

+0

を参照してください。 setDataでは、私は単にこれを追加しました:for range(self.rowCount(index)):self.setData(index.child(i、0)、value、role)しかし、C:をクリックすると遅くなります。任意のアイデアをどのようにこれを解決するには? – Kiarash

関連する問題