Hi, I sub-classed QListWidget to handle drag&drop. This new object should handle both internal move and item copy when drag&drop between qlistwidgets. I achieved the latter (copy on drop) but internal move is a problem: I'm unable to get it right. This is my implementation:

Qt Code:
  1. MyListWidget::MyListWidget(QWidget *parent) :
  2. QListWidget(parent)
  3. {
  4. setAlternatingRowColors(true);
  5.  
  6. setDragEnabled(true);
  7. setDragDropMode(QAbstractItemView::InternalMove);
  8. setDropIndicatorShown(true);
  9.  
  10. setAcceptDrops(true);
  11. }
  12.  
  13. void MyListWidget::dragEnterEvent(QDragEnterEvent *event)
  14. {
  15. if(event->source() == this) {
  16. QListWidget::dragEnterEvent(event);
  17. } else if (event->mimeData()->hasFormat("application/x-myapp")) {
  18. if (event->source() == this) {
  19. event->setDropAction(Qt::MoveAction);
  20. event->accept();
  21. } else {
  22. event->acceptProposedAction();
  23. }
  24. } else {
  25. event->ignore();
  26. }
  27. }
  28.  
  29. void MyListWidget::dragMoveEvent(QDragMoveEvent *event)
  30. {
  31. if(event->source() == this) {
  32. QListWidget::dragMoveEvent(event);
  33. } else if (event->mimeData()->hasFormat("application/x-myapp")) {
  34. if (event->source() == this) {
  35. event->setDropAction(Qt::MoveAction);
  36. event->accept();
  37. } else {
  38. event->acceptProposedAction();
  39. }
  40. } else {
  41. event->ignore();
  42. }
  43. }
  44.  
  45. void MyListWidget::dropEvent(QDropEvent *event)
  46. {
  47. if (event->source() == this) {
  48. QListWidget::dropEvent(event);
  49. } else if (event->mimeData()->hasFormat("application/x-myapp")) {
  50. QByteArray itemData = event->mimeData()->data("application/x-myapp");
  51. QDataStream dataStream(&itemData, QIODevice::ReadOnly);
  52.  
  53. People people;
  54. dataStream >> people;
  55.  
  56. if (event->source() == this) {
  57. event->setDropAction(Qt::MoveAction);
  58. event->accept();
  59. } else {
  60. PeopleItem *peopleItem = new PeopleItem(people, this);
  61. addItem(wItem);
  62. setItemWidget(wItem, peopleItem);
  63. wItem->setSizeHint(QSize(40,40));
  64. event->acceptProposedAction();
  65. }
  66. } else {
  67. event->ignore();
  68. }
  69. }
  70.  
  71. void MyListWidget::mousePressEvent(QMouseEvent *event)
  72. {
  73. People people = ((PeopleItem *)itemWidget(itemAt(event->pos())))->people();
  74.  
  75. QByteArray itemData;
  76. QDataStream dataStream(&itemData, QIODevice::WriteOnly);
  77. dataStream << people;
  78.  
  79. QMimeData *mimeData = new QMimeData;
  80. mimeData->setData("application/x-myapp", itemData);
  81.  
  82. QDrag *drag = new QDrag(this);
  83. drag->setMimeData(mimeData);
  84.  
  85. drag->exec(Qt::CopyAction);
  86. }
To copy to clipboard, switch view to plain text mode 

Where's my error?

Thanks,