【问题标题】:Reordering items QAbstractListModel -- dropMimeData never called重新排序项目 QAbstractListModel -- dropMimeData 从未调用
【发布时间】:2011-12-28 22:27:25
【问题描述】:

我有类MyListModel,它继承自使用 QListView 或自定义子类显示的 QAbstractListModel。我希望列表中的每个项目都是可编辑的,并且用户能够拖放以重新排列项目的顺序(我实际上并不相信 QListView 是要走的路,但它看起来像不会有太多麻烦。哦,好吧。)。

这些项目是可拖动的,但会显示一个带叉的小圆圈,这意味着我不能在那里放置任何东西。

我尝试了this question 中建议的所有方法,但似乎没有任何效果。 dropMimeData 函数从未被调用,尽管 mimeData 似乎产生了我的占位符数据。

我认为我在其他课程中没有做错任何事情,所以我只是将模型课程放在这篇文章中。间距可能有点古怪。

感谢您的帮助。

我的模特:

class MyListModel(QtCore.QAbstractListModel):

def __init__(self, parent, items=None):
    super(self.__class__, self).__init__()
    print "initiating MyListModel"
    self.parent = parent
    self._items = list()

    for thing in items:
        self._items.append(thing)

    self.setSupportedDragActions(QtCore.Qt.MoveAction)

def rowCount(self, parent = QtCore.QModelIndex()):
    return len(self._items)

def data(self, index, role = QtCore.Qt.DisplayRole):
    if (role == QtCore.Qt.DisplayRole) or (role == QtCore.Qt.EditRole):
        return self._items[index.row()].name
    else:
        return 

def setData(self, index, value, role=QtCore.Qt.EditRole):
    print "Setting Data", value, "at", index.row(), 

    if role == QtCore.Qt.EditRole:
        print "EditRole"
        self._items[index.row()].name = value
        return True
    elif role == QtCore.Qt.DisplayRole:
        print "DisplayRole"
        print role
        return False
    else:
        print "other"
        print role
        return False


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

def insertRows(self, row, count, parent):
    print "insertRows"
    self.beginInsertRows(parent, row, (row + (count - 1)))
    #self._items.insert(row, object)
    self.endInsertRows() 
    return True 


def supportedDropActions(self):
    print "supportedDrop"
    return (QtCore.Qt.MoveAction | QtCore.Qt.CopyAction)

def supportedDragActions(self):
    print "supportedDraw"
    return (QtCore.Qt.MoveAction | QtCore.Qt.CopyAction)

def mimeData(self, indexes):
    print "mimeData at (", indexes[0].row(), ",", indexes[0].column(), ")",
    self.old_index = indexes[0].row()

    old_stuff = pickle.dumps(self._items[indexes[0].row()])
    print type(old_stuff)
    mimeData = QtCore.QMimeData()
    mimeData.setText(old_stuff)

    return mimeData

def dropMimeData(self, data, action, row, column, parent):
    print "dropMimeData"
    '''
    self.beginInsertRows(parentIndex, row, row)

    if action == QtCore.Qt.IgnoreAction: 
        return True 

    if data.hasText():
        print data
    return False
    '''

def mimeTypes(self):
    print 'mimeTypes'
    return list("text/plain")

【问题讨论】:

    标签: qt pyside


    【解决方案1】:

    mimeData 方法中,尝试将mimeData = QtCore.QMimeData() 更改为mimeData = super(MyListModel, self).mimeData(indexes)

    我相信如果您自己创建 mimeData 对象,它的生命周期会出现问题,它会被过早删除。如果您执行上述操作,它似乎具有正确的生命周期。不过,这只是一个猜测。

    【讨论】:

      【解决方案2】:

      这已经很晚了,但您还应该在视图中设置拖放模式。

      class MyListView(QListView):
      def __init__(self, parent=None):
          QListView.__init__(self, parent)
      
          self._model = MyListModel(self)
          self.setModel(self._model)
      
          self.setDragDropMode(QAbstractItemView.InternalMove)
      

      Documentation

      【讨论】:

        猜你喜欢
        • 2018-09-16
        • 2017-06-16
        • 1970-01-01
        • 2018-06-14
        • 2010-10-14
        • 1970-01-01
        • 2019-06-11
        • 1970-01-01
        • 2016-05-04
        相关资源
        最近更新 更多