[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