在qListView中,已删除的项目未在视图

时间:2016-05-10 18:51:50

标签: python qt model-view-controller pyqt pyqt4

我的qListView填充了实际上是我从文件夹中读取的文件名的项目。 现在,使用上下文菜单操作“删除”,我将在后台删除相应的文件。

问题是qListView,没有得到更新,即。它仍然显示我已删除的项目。

我的查询是,如何动态刷新视图?我是MVC编程的新手,想知道是否有可能在模型中做到这一点?或者,我是否必须使用递归函数来更新视图。 BTW m使用qAbstract列表模型,甚至尝试过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

感谢您的时间:)

1 个答案:

答案 0 :(得分:1)

QStandardItemModel

Chirag如果你正在编写自己的模型,它将耗费大量时间。请查看 QStandardItemModel ,因为它为我们提供了许多已经实现的内容,我们需要根据我们的要求在代码中使用它们。

我正在使用这个QStandardItemModel并拥有自己的contextmenu。

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())