我构建了一个可检查的树视图列出文件/文件夹。我正在保存已检查的文件/文件夹,并将它们写入文件。当我再次启动树视图时,我希望它检查我保存的所有路径。但是我无法获得路径的正确索引。
class CheckableModel(QtGui.QFileSystemModel):
def __init__(self, tView, parent=None):
QtGui.QFileSystemModel.__init__(self, tView)
self.tView = tView
self.checks = {}
backupstr = fileread(os.path.join(os.path.expanduser("~"), "Desktop"), "saved.txt", "utf-16")
if backupstr:
backuplist = backupstr.split('\n')
for backupitem in backuplist:
self.setData(self.index(backupitem), QtCore.Qt(QtCore.Qt.Checked), QtCore.Qt.CheckStateRole)
我尝试使用self.index(QString)
,但它始终无法正常运行。就像,当我尝试从self.checks
中删除此条目时(取消选中以这种方式加载的节点),它无法在self.checks
中找到该索引。
那么,当我们有路径时,在树视图中获取索引(QModelIndex
)的正确方法是什么?
编辑:
setData()
的实施方式如下:
def setData(self, index, value, role):
if (role == QtCore.Qt.CheckStateRole) and (index.column() == 0):
if value == QtCore.Qt.Checked:
self.removesubfolders(index)
self.checks[index] = value
count = self.rowCount(index)
self.dataChanged.emit(index.child(0, 0), index.child(count - 1, 0))
self.tView.collapse(index)
return True
elif value == QtCore.Qt.Unchecked:
self.removesubfolders(index)
self.tView.collapse(index)
return True
return QtGui.QFileSystemModel.setData(self, index, value, role)
def removesubfolders(self, index):
checkedItems = []
for otherindex, othervalue in self.checks.items():
if othervalue.toBool():
checkedItems.append(str(self.filePath(otherindex)))
uncheckpath = str(self.filePath(index))
indices = [removeindex for removeindex in checkedItems if (removeindex.find(uncheckpath) != -1)]
for idx in indices:
localidx = self.index(idx)
if localidx in self.checks:
self.checks.pop(localidx)
答案 0 :(得分:0)
找到了解决方法。保持文件/文件夹路径,而不是保留树节点的QModelIndex
。这似乎有效。
class CheckableDirModel(QtGui.QFileSystemModel):
def __init__(self, tView, parent=None):
QtGui.QFileSystemModel.__init__(self, tView)
self.tView = tView
self.checks = {}
backupstr = fileread(os.path.join(os.path.expanduser("~"), "Desktop"), "saved.txt", "utf-8")
if backupstr:
backuplist = backupstr.split('\n')
for backupitem in backuplist:
self.checks[backupitem] = QtCore.Qt.Checked
def setData(self, index, value, role):
if (role == QtCore.Qt.CheckStateRole) and (index.column() == 0):
self.tView.selectionchanged = True
if value == QtCore.Qt.Checked:
self.removesubfolders(index)
self.checks[str(self.filePath(index))] = QtCore.Qt.Checked
elif value == QtCore.Qt.Unchecked:
self.removesubfolders(index)
def removesubfolders(self, index):
checkedItems = []
for otherindex, othervalue in self.checks.items():
if othervalue == QtCore.Qt.Checked:
checkedItems.append(otherindex)
uncheckpath = str(self.filePath(index))
indices = [removeindex for removeindex in checkedItems if self.eligibleIndex(removeindex, uncheckpath)]
for idx in indices:
localidx = self.index(idx)
if str(self.filePath(localidx)) in self.checks:
self.checks.pop(str(self.filePath(localidx)))