PySide - QListView在拖放过程中创建新项目而不是传递原始

时间:2017-02-01 23:35:30

标签: python qt pyside

我正在编写一个QListView的PySide应用程序。此QListView允许拖放事件更改其显示的项目的顺序。

QListView使用QStandardItemModelQStandardItemModel包含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,而不使用子类。没有区别。

子类QListViewQStandardItemModel类如下:

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属性,但丢弃我的自定义属性。

请注意,访问这些自定义属性适用于所有未移动的项目。此外,使用CustomItemmodel.appendRow(item)附加或插入model.insertRow(index, item)也可以正常使用,因此问题不在于这些方法。

如何在整个移动事件中维护这些自定义属性?我是否需要改变移动事件的行为,如果是,如何改变?

0 个答案:

没有答案