2016-05-10 3 views
0

У меня есть qListView, заполненный элементами, которые на самом деле являются именами файлов, которые я читаю из папки. Теперь, используя действие контекстного меню «удалить», я удаляю соответствующий файл в фоновом режиме.В qListView удаленные элементы не обновляются в поле зрения

Проблема заключается в qListView, не получающем обновления, т.е. он все еще показывает элемент, который я уже удаляю.

Мой запрос: как обновить представление динамически? Я новичок в программировании MVC, задавался вопросом, возможно ли это сделать в модели? Или мне нужно использовать рекурсивную функцию для обновления представлений. BTW m с использованием модели qAbstract list и даже попробовал currentItemChanged и dataChanged, но ничего не работает.

TestStepInstViewHdlr является экземпляром класса QListView:

TestStepInstViewHdlr.setSelectionMode(QAbstractItemView.MultiSelection) 
TestStepInstViewHdlr.show() 
TestStepViewHdlr.stepSelected.connect(getTestStepName) 
TestStepInstViewHdlr.itemSelectionChanged.connect(TestStepInstViewHdlr.getInstanceName) 
TestStepInstViewHdlr.customContextMenuRequested.connect(TestStepInstViewHdlr.onContext) 

def getInstanceName(self): 
    index = self.selectedIndexes() 
    val = "" 
    valArray = [] 
    for i in index: 
     val = i.data() 
     valArray.append(val) 
    print(valArray) 
    return valArray 

def onContext(self, position): 
    instArray = [] 
    constHdlr = const.Constant() 
    # Create a menu 
    menu = QtGui.QMenu() 
    rmvAction = menu.addAction("Remove") 
    canAction = menu.addAction("Cancel") 
    action = menu.exec_(self.mapToGlobal(position)) 
    if action == rmvAction: 
     instArray = self.getInstanceName() 
     path = constHdlr.TEST_STEP_INSTANCE_PATH + StepName+"\\" 
     for inst in instArray: 
      path = path + inst 
      if os.path.isfile(path): 
       os.remove(path) 

    if action == canAction: 
     pass 

Моя модель:

class TestStepInstListModel(QtCore.QAbstractListModel): 

    def __init__(self, TestSteps = [], parent = None): 
     QtCore.QAbstractListModel.__init__(self, parent) 
     self.__TestSteps = TestSteps 

    def rowCount(self, parent = None): 
     return len(self.__TestSteps) 

    def data(self, index, role): 
     if role == QtCore.Qt.DisplayRole: 
      row = index.row() 
      return self.__TestSteps[row] 

    def flags(self, index): 
     return QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled 

    def removeRows(self, position, rows, parent = QtCore.QModelIndex()): 
     self.beginRemoveRows(parent, position, position + rows - 1) 
     for i in range(rows): 
      value = self.__TestSteps[position] 
      self.__TestSteps.remove(value) 
     self.endRemoveRows() 
     return True 

Спасибо за ваше время :)

+0

Что вы модель? Почему вы не удаляете элементы из модели? Затем модель должна обрабатывать удаление файла. –

+0

Привет, Kuba, я обновил код модели. Моделю удалить файлы и обновить представления, мне нужно проверить. –

+1

Вы пытаетесь сделать что-то, что уже сделано. См. [QDirModel] (http://doc.qt.io/qt-5/qdirmodel.html). –

ответ

1

QStandardItemModel

Чираг если вы пишете ваша собственная модель, она будет потреблять много времени. Вместо этого проверьте QStandardItemModel, так как он предоставляет нам множество вещей, которые уже реализованы, и нам нужно просто использовать их в нашем коде согласно нашим требованиям.

Я использую этот QStandardItemModel и имею свое собственное контекстное меню.

self.model = QtGui.QStandardItemModel() 

Если я выбираю удалить опцию в моем коде, этот кусок кода поможет нам при удалении элемента, выбранного в нашем ListView (то есть., Чтобы удалить эту конкретную строку).

item_to_be_deleted = self.listView.selectionModel().currentIndex().data().toString() 
      model = self.model 
      for item in model.findItems(item_to_be_deleted): 
       model.removeRow(item.row()) 
+0

Спасибо, Джуна за ответ. Но я использовал QFileSystemModel, который похож на (с точки зрения производительности на) QDirModel, как предложил Marek R. И легко управлять и работать как шарм !! –

+0

@chirag был этот код полезен для обновления вашего списка динамически ..? –

Смежные вопросы