我正在编写一个QListView
的PySide应用程序。此QListView
允许拖放事件更改其显示的项目的顺序。
QListView
使用QStandardItemModel
,QStandardItemModel
包含QStanardItem
个对象。我已经为这些QStandardItem
个对象提供了自定义实例属性,如下所示:
def createShotItem(self, path, display_name, name):
item = CustomItem(display_name)
item.setCheckable(True)
item.setCheckState(QtCore.Qt.Checked)
item.path = path
item.name = name
item.fields = {} # Used to store setting fields
return item
以下是CustomItem
课程。
class CustomItem(QtGui.QStandardItem):
def __init__(self, text):
self.shot_path = ""
self.name = ""
self.fields = {}
super(CustomItem, self).__init__(text)
以前,我只是直接将属性添加到QStandardItem
,而不使用子类。没有区别。
子类QListView
和QStandardItemModel
类如下:
class DragDropListView(QtGui.QListView):
def __init__(self):
super(DragDropListView, self).__init__()
self.setAcceptDrops(True)
self.setDragDropMode(QtGui.QAbstractItemView.DragDrop)
self.setDefaultDropAction(QtCore.Qt.MoveAction)
self.setDragDropOverwriteMode(False)
self.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
def dragEnterEvent(self, event):
if __name__ == '__main__':
if event.mimeData().hasUrls:
event.acceptProposedAction()
else:
super(DragDropListView, self).dragEnterEvent(event)
class DragDropItemModel(QtGui.QStandardItemModel):
def __init__(self):
super(DragDropItemModel, self).__init__()
def flags(self, index):
if index.isValid():
return QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsEnabled \
| QtCore.Qt.ItemIsUserCheckable
return QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsDragEnabled \
| QtCore.Qt.ItemIsDropEnabled | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsUserCheckable
当我稍后尝试访问已在列表中移动的项目上的其中一个属性时,我收到如下错误:
AttributeError: 'PySide.QtGui.QStandardItem' object has no attribute 'fields'
正如您所看到的,CustomItem
扩展为QStandardItem
,已被QStandardItem
取代,但不包含任何自定义属性。
我认为这是因为,当由于拖放事件而发生重新排序时,PySide会在所需索引处创建一个新的QStandardItem
,其中包含相同的text
属性和其他PySide属性,但丢弃我的自定义属性。
请注意,访问这些自定义属性适用于所有未移动的项目。此外,使用CustomItem
或model.appendRow(item)
附加或插入model.insertRow(index, item)
也可以正常使用,因此问题不在于这些方法。
如何在整个移动事件中维护这些自定义属性?我是否需要改变移动事件的行为,如果是,如何改变?