我的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
感谢您的时间:)
答案 0 :(得分:1)
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())