dragdroptablewidget.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include "dragdroptablewidget.h"
  2. #include <QDebug>
  3. #include <QHeaderView>
  4. #include <QMimeData>
  5. DragDropTableWidget::DragDropTableWidget(QWidget *parent) : QTableWidget(parent), m_currentDragRow(-1) {
  6. setAcceptDrops(true);
  7. setDragEnabled(true);
  8. setDropIndicatorShown(true);
  9. setSelectionBehavior(QAbstractItemView::SelectRows);
  10. setDragDropMode(QAbstractItemView::DragDrop); // Changed from InternalMove
  11. setDragDropOverwriteMode(false);
  12. setDefaultDropAction(Qt::MoveAction);
  13. verticalHeader()->setVisible(false);
  14. horizontalHeader()->setStretchLastSection(true);
  15. // Track selection changes to know which row is being dragged
  16. connect(this, &QTableWidget::itemSelectionChanged, this, [this]() {
  17. m_currentDragRow = currentRow();
  18. qDebug() << "Selection changed, current row:" << m_currentDragRow;
  19. });
  20. }
  21. void DragDropTableWidget::dragEnterEvent(QDragEnterEvent *event) {
  22. qDebug() << "DragDropTableWidget::dragEnterEvent";
  23. if (event->source() == this && event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist")) {
  24. event->setAccepted(true);
  25. } else {
  26. event->ignore();
  27. }
  28. }
  29. void DragDropTableWidget::dragMoveEvent(QDragMoveEvent *event) {
  30. qDebug() << "DragDropTableWidget::dragMoveEvent";
  31. if (event->source() == this && event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist")) {
  32. event->setAccepted(true);
  33. } else {
  34. event->ignore();
  35. }
  36. }
  37. void DragDropTableWidget::dropEvent(QDropEvent *event) {
  38. qDebug() << "DragDropTableWidget::dropEvent source=" << event->source() << " m_currentDragRow=" << m_currentDragRow;
  39. // Prevent default handling by the widget
  40. event->setAccepted(true);
  41. if (event->source() != this) {
  42. qDebug() << "Drop event ignored: source is not this table";
  43. return;
  44. }
  45. int toRow = indexAt(event->pos()).row();
  46. if (toRow == -1) {
  47. toRow = rowCount();
  48. }
  49. qDebug() << "Drop at row:" << toRow;
  50. if (m_currentDragRow >= 0 && m_currentDragRow != toRow) {
  51. emit rowDropped(m_currentDragRow, toRow);
  52. }
  53. }