Перетаскиваемые элементы в 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 который мне нужно переопределить, чтобы фактически получить / принять событие сброса. Но какой?

0 ответов

Другие вопросы по тегам