PyQt4本地目录视图并选择文件夹选项

6 投票
1 回答
3438 浏览
提问于 2025-04-17 18:46

我知道怎么用QTreeView()和QDirModel(或者QFileSystemModel)来创建一个简单的树形视图,显示系统里的文件和文件夹。但我想在每个文件和文件夹旁边加一个复选框,这样用户就可以选择他系统中的一些文件夹或文件。显然,我还需要知道用户选择了哪些。有什么建议吗?

基本上是这样的……

在这里输入图片描述

下面是一个示例代码,它创建了一个目录视图,但没有复选框。

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

1 个回答

6

你可以创建一个新的类,继承自QDirModel,并重新实现一个叫做 data(index,role) 的方法。在这个方法里,你需要检查一下 role 是否是 QtCore.Qt.CheckStateRole。如果是的话,你就要返回 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)

撰写回答