在 qListView 中,已删除的项目不会在视图中更新
Posted
技术标签:
【中文标题】在 qListView 中,已删除的项目不会在视图中更新【英文标题】:In qListView, items deleted are not getting updated in view 【发布时间】:2016-05-10 18:51:49 【问题描述】:我在 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
感谢您的宝贵时间 :)
【问题讨论】:
你的型号是什么?你为什么不从模型中删除项目呢?然后模型应该处理删除文件。 嗨,Kuba,我更新了模型代码。模型要删除文件并更新视图,我需要检查一下。 您正在尝试做一些已经完成的事情。见QDirModel。 您在哪里拨打removeRows
?真的执行了吗?
【参考方案1】:
QStandardItemModel
如果您正在编写自己的模型,那么 Chirag 会消耗大量时间。相反,请查看 QStandardItemModel,因为它为我们提供了许多已经实现的东西,我们只需要根据我们的要求在代码中使用它们。
我正在使用这个 QStandardItemModel 并且有自己的上下文菜单。
self.model = QtGui.QStandardItemModel()
如果我在我的代码中选择删除选项,这段代码将帮助我们删除列表视图中选择的项目(即删除该特定行)。
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())
【讨论】:
感谢朱娜的回答。但是我使用了 QFileSystemModel,它类似于 Marek R 建议的 QDirModel(性能方面的进步)。而且它很容易管理和工作,就像魅力一样!! @chirag 这段代码对动态更新列表视图有帮助吗?以上是关于在 qListView 中,已删除的项目不会在视图中更新的主要内容,如果未能解决你的问题,请参考以下文章
当 QListView 由 QComboBoxes 填充时获取信号