PyQt4本地目录视图并选择文件夹选项
我知道怎么用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)