[PyQt] Drag and Drop of subclassed QListWidgetItem
Vincent Vande Vyvre
vincent.vandevyvre at swing.be
Tue Jun 24 11:24:43 BST 2014
Le 24/06/2014 10:44, Massi a écrit :
> Hi everyone,
> I'm encountering some poblems trying to implement drag and drop for a
> custom QListWidgetItem. Here is some example code:
> from PyQt4 import QtGui, QtCore
> import sys, os
> class MyListWidgetItem(QtGui.QListWidgetItem):
> def __init__(self, label, data, parent=None):
> super(QtGui.QListWidgetItem, self).__init__(label, parent=parent)
> self.data = data
> def GetData(self):
> return self.data
> class MyListWidget(QtGui.QListWidget):
> def __init__(self, type, parent=None):
> super(MyListWidget, self).__init__(parent)
> self.setDragDropMode(QtGui.QAbstractItemView.DragDrop)
> self.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
> self.setAcceptDrops(True)
> self.viewport().setAcceptDrops(True)
> self.setDropIndicatorShown(True)
> def startDrag(self, supportedActions):
> drag = QtGui.QDrag(self)
> t = [i.GetData() for i in self.selectedItems()]
> mimeData = self.model().mimeData(self.selectedIndexes())
> mimeData.setText(str(t))
> drag.setMimeData(mimeData)
> if drag.start(QtCore.Qt.MoveAction) == QtCore.Qt.MoveAction:
> for item in self.selectedItems():
> self.takeItem(self.row(item))
> def dragEnterEvent(self, event):
> if event.mimeData().hasUrls():
> event.ignore()
> else:
> event.accept()
> def dragMoveEvent(self, event):
> if event.mimeData().hasUrls():
> event.ignore()
> else:
> event.accept()
> def dropEvent(self, event):
> if event.mimeData().hasUrls():
> event.ignore()
> if isinstance(event.source(), MyListWidget):
> event.setDropAction(QtCore.Qt.MoveAction)
> super(MyListWidget, self).dropEvent(event)
> else:
> event.ignore()
> def dropMimeData(self, index, mimedata, action):
> super(MyListWidget, self).dropMimeData(index, mimedata, action)
> return True
> class Test(QtGui.QMainWindow):
> def __init__(self):
> super(QtGui.QMainWindow,self).__init__()
> myQWidget = QtGui.QWidget()
> myBoxLayout = QtGui.QVBoxLayout()
> myQWidget.setLayout(myBoxLayout)
> self.setCentralWidget(myQWidget)
> self.listWidgetA = MyListWidget(self)
> self.listWidgetB = MyListWidget(self)
> for i in range(5):
> listItemAInstance = MyListWidgetItem(str(i), i,
> parent=self.listWidgetA)
> myBoxLayout.addWidget(self.listWidgetA)
> myBoxLayout.addWidget(self.listWidgetB)
> if __name__ == '__main__':
> app = QtGui.QApplication(sys.argv)
> dialog_1 = Test()
> dialog_1.show()
> dialog_1.resize(480,320)
> sys.exit(app.exec_())
> My custom class MyListWidgetItem has a 'data' field which in my real
> program holds some information related to the item. If you run the
> code and try to drag and drop items from the top list to the bottom
> one everything works, but if you then try to bring them back to the
> top list you get this error:
> Traceback (most recent call last):
> File "C:\Users\Massi\Desktop\t.py", line 23, in startDrag
> t = [i.GetData() for i in self.selectedItems()]
> AttributeError: 'QListWidgetItem' object has no attribute 'GetData'
> It seems pretty clear that the default drag and drop behaviour ignores
> that the list items have been subclassed, so I wonder which is the
> best to deal with this situation. Any help is really appreciated.
> Thanks in advance!
>
>
> _______________________________________________
> PyQt mailing list PyQt at riverbankcomputing.com
> http://www.riverbankcomputing.com/mailman/listinfo/pyqt
Works fine for me.
Platform Linux-3.2.0-48-generic-pae-i686-with-Ubuntu-12.04-precise
Qt 4.8.1
Python 2.7.3
PyQt 4.9.1
Sip 4.13.2
--
Vincent V.V.
Oqapy <https://launchpad.net/oqapy> . Qarte
<https://launchpad.net/qarte> . PaQager <https://launchpad.net/paqager>
More information about the PyQt
mailing list