Перетаскиваемые элементы в QListView
Я пытаюсь создать список-виджет, где UESR может переставить элементы, перетаскивая их в виджете, используя PySide-1.2.2
/Qt-4.8.7
Это довольно просто с простым QListWidget
:
from PySide.QtCore import *
from PySide.QtGui import *
import sys
class MyMainWindow(QWidget):
def __init__(self):
QWidget.__init__(self, None)
vbox = QVBoxLayout()
v = QListWidget()
v.addItems(["A", "BB", "CCC", "DDDD", "EEEEE"])
v.setDragDropMode(QAbstractItemView.InternalMove)
vbox.addWidget(v)
self.setLayout(vbox)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyMainWindow()
w.show()
app.exec_()
sys.exit()
Тем не менее, я пытаюсь сделать то же самое с QListView
/QAbstractListModel
и пока я могу "схватить" предмет и drag
это вокруг, я не могу drop
Это. Согласно документам, этого должно быть достаточно, чтобы установить модель данных supportedDragActions
и верните правильный flags
, Я тоже включил drag
, acceptDrops
и установить DragDropMode
в InternalMode
для QListView
, но безрезультатно.
from PySide.QtCore import *
from PySide.QtGui import *
import sys
class SimpleListModel(QAbstractListModel):
def __init__(self, mlist):
QAbstractListModel.__init__(self)
self._items = mlist
self.setSupportedDragActions(Qt.CopyAction | Qt.MoveAction | Qt.TargetMoveAction)
def rowCount(self, parent = QModelIndex()):
return len(self._items)
def data(self, index, role = Qt.DisplayRole):
if role == Qt.DisplayRole:
return self._items[index.row()]
def flags(self, index):
if index.isValid():
return Qt.ItemIsSelectable|Qt.ItemIsDragEnabled|Qt.ItemIsEnabled
return Qt.ItemIsSelectable|Qt.ItemIsDragEnabled| \
Qt.ItemIsDropEnabled|Qt.ItemIsEnabled
class SimpleListView(QListView):
def __init__(self, parent = None):
QListView.__init__(self, parent)
self.setAcceptDrops(True)
self.setDragEnabled(True)
self.setDragDropMode(QAbstractItemView.InternalMove)
class MyMainWindow(QWidget):
def __init__(self):
QWidget.__init__(self, None)
vbox = QVBoxLayout()
m = SimpleListModel(["A", "BB", "CCC", "DDDD", "EEEEE"])
v = SimpleListView()
v.setModel(m)
vbox.addWidget(v)
self.setLayout(vbox)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyMainWindow()
w.show()
app.exec_()
sys.exit()
Я думаю, что есть какой-то метод QAbstractListModel
который мне нужно переопределить, чтобы фактически получить / принять событие сброса. Но какой?