Python 2.7 Can';似乎无法在QListView中启用拖放

Python 2.7 Can';似乎无法在QListView中启用拖放,python-2.7,pyqt,pyqt4,qlistview,Python 2.7,Pyqt,Pyqt4,Qlistview,我能够在QListWidget上非常轻松地进行拖放操作,在这里我为它分配了单独的项目,但后来我切换到QListView和模型/视图模式,似乎无法让它工作。我只想让用户对列表中的对象进行重新排序,但我不想让他们实际编辑这些对象(除了前面提到的重新排序)。以下是我所做的: from PyQt4.QtCore import * from PyQt4.QtGui import * class AlgorithmListControl(QListView): def __init__(self,

我能够在QListWidget上非常轻松地进行拖放操作,在这里我为它分配了单独的项目,但后来我切换到QListView和模型/视图模式,似乎无法让它工作。我只想让用户对列表中的对象进行重新排序,但我不想让他们实际编辑这些对象(除了前面提到的重新排序)。以下是我所做的:

from PyQt4.QtCore import *
from PyQt4.QtGui import *

class AlgorithmListControl(QListView):
    def __init__(self, parent = None):
        super(AlgorithmListControl, self).__init__(parent)

        self.parent = parent
        self.setAcceptDrops(True)
        self.setDragEnabled(True)
        self.setDragDropMode(QAbstractItemView.InternalMove)
        self.setDefaultDropAction(Qt.MoveAction)
        self.setDropIndicatorShown(True)
对于数据模型,我只需声明一个继承自QAbstractListModel的类,实现“rowCount”和“data”方法,向其添加一些对象,然后通过“myAlgorithmList.setModel(myModel)”将其指定为上述类的模型。到目前为止,一切正常。我可以看到列表中的对象,它们的图标显示正常,顺序正确,等等。但是,我无法通过拖放对它们重新排序。当我尝试拖动一个项目时,没有任何视觉指示表明拖动模式已经启动,当然,如果我尝试拖放,则不会发生任何事情。好像还没有设置拖放模式。我错过了什么?我四处搜寻了一段时间,没有任何东西向我扑来。这可能与模型的可编辑性有关吗?我在模型中添加了以下内容,但没有任何效果:

def flags(self, index):
    return (Qt.ItemIsEditable | Qt.ItemIsEnabled | Qt.ItemIsSelectable)
这件事让我抓狂

更新:我已将flags语句更改为以下内容:

def flags(self, index):
    if index.isValid():
        return Qt.ItemIsSelectable | Qt.ItemIsDragEnabled | Qt.ItemIsEnabled
    return Qt.ItemIsSelectable | Qt.ItemIsDragEnabled | Qt.ItemIsDropEnabled | Qt.ItemIsEnabled
我现在至少可以拖动一个项目,但在发布时不会发生任何事情

更新:在阅读了注释之后,我正在为模型添加代码。显然问题就在那里。我已经开始实现模型的“insertRows()”方法,但是如果我在该方法中放置一个断点并在运行时尝试拖放操作,该方法显然永远不会被调用。我还不确定基于“insertRows()”方法中的拖放对列表重新排序的逻辑。非常感谢您的帮助:

from PyQt4.QtCore import *
from PyQt4.QtGui import *

class AlgorithmSequenceModel(QAbstractListModel):

    def __init__(self, parent = None):
        super(AlgorithmSequenceModel, self).__init__(parent)

        self.parent = parent

        # Instantiate an empty list for holding the list of algorithm objects in the proper sequence:
        self.algorithms = list()

        # Do I need this?: self.setSupportedDragActions(Qt.MoveAction)

    def rowCount(self, parent):

        # Return the number of algorithms in the current sequence:
        return len(self.algorithms)

    def flags(self, index):
        if index.isValid():
            return Qt.ItemIsSelectable | Qt.ItemIsDragEnabled | Qt.ItemIsEnabled | Qt.ItemIsDropEnabled
        return Qt.ItemIsSelectable | Qt.ItemIsDragEnabled | Qt.ItemIsDropEnabled | Qt.ItemIsEnabled

    def data(self, index, role):

        # Check the role that's being queried:
        if role == Qt.DisplayRole:

            # Retrieve the algorithm and return its name:
            row = index.row()
            return self.algorithms[row].getName()

        if role == Qt.DecorationRole:

            # Retrieve the algorithm and return the icon object reflecting its current state:
            row = index.row()
            return self.algorithms[row].getCurrentStateIcon()

    def setData(self, index, value, role = Qt.EditRole):
        # Data is not editable by user.
        pass

    def insertRows(self, position, rows, parent):

        self.beginInsertRows()

        # Very uncertain how to implement reordering here. Dragged item needs to be removed from its original location and inserted in new location

        self.endInsertRows()


    def addAlgorithm(self, algorithm):

        # Append the algorithm to the end of list:
        self.algorithms.append(algorithm)

除非你迫切需要使用自定义模型,否则我会考虑使用<代码> qStaldItMeimult>代码>。code>QAbstractListModel具有drop事件处理的默认实现,这在您的情况下可能就足够了,但实际的模型类必须至少实现
insertRows
insertColumns
setData
方法。您的模型实现了这些方法吗?@Dmitry:谢谢,但您的意思是我需要自己在“insertRows”中实现插入逻辑吗?是的,这就是我的意思
QAbstractListModel
不会重新实现
insertRows
本身,而
QAbstractItemModel
的实现根本不起任何作用。我添加了一个(几乎为空的)“insertRows()”方法并设置了一个断点,但显然这个方法在运行时从未被调用。我也不清楚如何在方法中实现逻辑。在“insertRows()”中,我需要首先删除正在拖动的项,然后(重新)将其插入到拖放位置的列表中。但是,我首先要如何让项目被拖动?在将它从列表中移除之后,这不会改变删除位置吗?我会考虑使用<代码> QStaleReTimeMedie,除非您迫切需要使用自定义模型。code>QAbstractListModel具有drop事件处理的默认实现,这在您的情况下可能就足够了,但实际的模型类必须至少实现
insertRows
insertColumns
setData
方法。您的模型实现了这些方法吗?@Dmitry:谢谢,但您的意思是我需要自己在“insertRows”中实现插入逻辑吗?是的,这就是我的意思
QAbstractListModel
不会重新实现
insertRows
本身,而
QAbstractItemModel
的实现根本不起任何作用。我添加了一个(几乎为空的)“insertRows()”方法并设置了一个断点,但显然这个方法在运行时从未被调用。我也不清楚如何在方法中实现逻辑。在“insertRows()”中,我需要首先删除正在拖动的项,然后(重新)将其插入到拖放位置的列表中。但是,我首先要如何让项目被拖动?从列表中删除后,这不会改变放置位置吗?