6

QDirModel (または QFileSystemModel) を使用して単純な QTreeView() を作成してシステム内のファイル/フォルダーを表示する方法は知っていますが、それぞれの横にチェックボックスを追加して、ユーザーがフォルダー/ファイルの一部を選択できるようにしたいと考えています。彼のシステム。明らかに、彼がどちらを選択したかを知る必要もあります。ヒントはありますか?

基本的にこのようなもの...

ここに画像の説明を入力

以下は、チェックボックスなしでディレクトリ ビューを作成するサンプル コードです。

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_())
4

1 に答える 1

6

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

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)
于 2013-03-14T07:39:58.783 に答える