【发布时间】: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")
【问题讨论】: