#include "dragdroptablewidget.h" #include #include #include DragDropTableWidget::DragDropTableWidget(QWidget *parent) : QTableWidget(parent), m_currentDragRow(-1) { setAcceptDrops(true); setDragEnabled(true); setDropIndicatorShown(true); setSelectionBehavior(QAbstractItemView::SelectRows); setDragDropMode(QAbstractItemView::DragDrop); // Changed from InternalMove setDragDropOverwriteMode(false); setDefaultDropAction(Qt::MoveAction); verticalHeader()->setVisible(false); horizontalHeader()->setStretchLastSection(true); // Track selection changes to know which row is being dragged connect(this, &QTableWidget::itemSelectionChanged, this, [this]() { m_currentDragRow = currentRow(); qDebug() << "Selection changed, current row:" << m_currentDragRow; }); } void DragDropTableWidget::dragEnterEvent(QDragEnterEvent *event) { qDebug() << "DragDropTableWidget::dragEnterEvent"; if (event->source() == this && event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist")) { event->setAccepted(true); } else { event->ignore(); } } void DragDropTableWidget::dragMoveEvent(QDragMoveEvent *event) { qDebug() << "DragDropTableWidget::dragMoveEvent"; if (event->source() == this && event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist")) { event->setAccepted(true); } else { event->ignore(); } } void DragDropTableWidget::dropEvent(QDropEvent *event) { qDebug() << "DragDropTableWidget::dropEvent source=" << event->source() << " m_currentDragRow=" << m_currentDragRow; // Prevent default handling by the widget event->setAccepted(true); if (event->source() != this) { qDebug() << "Drop event ignored: source is not this table"; return; } int toRow = indexAt(event->pos()).row(); if (toRow == -1) { toRow = rowCount(); } qDebug() << "Drop at row:" << toRow; if (m_currentDragRow >= 0 && m_currentDragRow != toRow) { emit rowDropped(m_currentDragRow, toRow); } }