【问题标题】:Getting the index in the tree view for the available path在树视图中获取可用路径的索引
【发布时间】:2016-02-14 15:34:18
【问题描述】:

我已经构建了一个可检查的树视图列表文件/文件夹。我正在保存检查的文件/文件夹,并将它们写入文件。当我再次启动树视图时,我希望它检查我保存的所有路径。但我无法获得路径的正确索引。

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)

【问题讨论】:

  • 你能提供一个更完整的例子吗?例如,您如何从self.checks 添加/删除条目,因为这似乎是一个问题?
  • 抱歉,我的项目很忙。我找到了解决办法。我现在维护文件/文件夹路径的字典以跟踪检查的项目(如答案中所述)。它似乎工作。如果您能提出更正建议或提供替代解决方案,我们将不胜感激。

标签: python pyqt pyside qtreeview qfilesystemmodel


【解决方案1】:

找到了解决方法。不是保留树节点的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)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多