PyQt4本地目录视图,带有选择文件夹的选项

时间:2013-03-12 05:29:28

标签: python qt pyqt pyqt4

我知道如何使用QDirModel(或QFileSystemModel)创建一个简单的QTreeView()来显示系统中的文件/文件夹,但我想在每个文件/文件夹旁边添加一个复选框,以便用户可以选择一些文件夹/他的系统上的文件。显然,我还需要知道他选择了哪些。任何提示?

基本上是这样的......

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

1 个答案:

答案 0 :(得分:5)

您可以继承QDirModel,并重新实现data(index,role)方法,如果roleQtCore.Qt.CheckStateRole,则应检查该方法。如果是,则应返回QtCore.Qt.CheckedQtCore.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)