2015-11-13 1 views
0

Я создал проверенные файлы/папки для отображения в виде дерева. Я сохраняю файлы/папки, которые отмечены, и записываю их в файл. Когда я снова запустил tree-view, я хочу, чтобы он проверял все пути, которые я сохранил. Но я не могу получить правильный указатель для путей.Получение указателя в древовидном представлении для доступного пути

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) в древовидном представлении, когда у нас есть только путь?

EDIT:

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) 
+1

Не могли бы вы предоставить более полный пример? Например, как вы добавляете/удаляете запись из 'self.checks', поскольку это кажется проблемой? – Mel

+0

Извините, я занят своим проектом. Я нашел работу. В настоящее время поддерживается ведение файлов/папок для отслеживания отмеченных элементов (как указано в ответе). Кажется, это работает. Если вы можете предложить исправления или предоставить альтернативное решение, оно будет очень оценено. – Harsh

ответ

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))) 
Смежные вопросы