From e341f3a54388726ecb965fbc1c530f0688f91028 Mon Sep 17 00:00:00 2001 From: taynpg Date: Wed, 18 Jun 2025 10:19:54 +0800 Subject: [PATCH] drag: cusTabwidget basic drag. --- Gui/Control/FileControl.cpp | 3 ++- Gui/Control/FileControl.h | 2 ++ Gui/Control/cusTableWidget.cpp | 46 +++++++++++++++++++--------------- Gui/Control/cusTableWidget.h | 8 ++++-- 4 files changed, 36 insertions(+), 23 deletions(-) diff --git a/Gui/Control/FileControl.cpp b/Gui/Control/FileControl.cpp index 8a52532..29c7e9b 100644 --- a/Gui/Control/FileControl.cpp +++ b/Gui/Control/FileControl.cpp @@ -33,6 +33,7 @@ void FileManager::SetModeStr(const QString& modeStr, int type, ClientCore* clien remotePtr->registerPathCall([this](const QString& path) { ShowPath(path); }); remotePtr->registerFileCall([this](const DirFileInfoVec& info) { ShowFile(info); }); remotePtr->setClientCore(clientCore); + fileTrans_ = new FileTrans(clientCore); fileHelper_ = remotePtr; } } @@ -61,7 +62,7 @@ void FileManager::InitControl() ui->tableWidget->viewport()->setAcceptDrops(true); ui->tableWidget->setDropIndicatorShown(true); ui->tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); - ui->tableWidget->setDragDropMode(QAbstractItemView::DragDrop); + ui->tableWidget->setDragDropMode(QAbstractItemView::NoDragDrop); connect(ui->btnHome, &QPushButton::clicked, this, &FileManager::evtHome); connect(ui->btnVisit, &QPushButton::clicked, this, &FileManager::evtFile); diff --git a/Gui/Control/FileControl.h b/Gui/Control/FileControl.h index e5af140..1b70be7 100644 --- a/Gui/Control/FileControl.h +++ b/Gui/Control/FileControl.h @@ -6,6 +6,7 @@ #include #include #include +#include namespace Ui { class FileManager; @@ -39,6 +40,7 @@ private: QString curRoot_; QMenu* localMenu_; QMenu* remoteMenu_; + FileTrans* fileTrans_; std::shared_ptr fileHelper_; }; diff --git a/Gui/Control/cusTableWidget.cpp b/Gui/Control/cusTableWidget.cpp index a6bad65..43602bf 100644 --- a/Gui/Control/cusTableWidget.cpp +++ b/Gui/Control/cusTableWidget.cpp @@ -1,9 +1,11 @@ #include "cusTableWidget.h" + +#include #include #include #include -CustomTableWidget::CustomTableWidget(QWidget* parent) +CustomTableWidget::CustomTableWidget(QWidget* parent) : QTableWidget(parent) { } @@ -17,22 +19,10 @@ void CustomTableWidget::dropEvent(QDropEvent* event) event->ignore(); return; } - - QModelIndex index = indexAt(event->pos()); - if (!index.isValid()) { - event->ignore(); - return; - } - - QString data = QString::fromUtf8(event->mimeData()->data("application/x-custom-data")); - QStringList items = data.split(","); - - //emit customDropRequested(items.first(), index.row(), index.column(), event->source()); - - event->acceptProposedAction(); + QTableWidget::dropEvent(event); } -void CustomTableWidget::dragMoveEvent(QDragMoveEvent* event) +void CustomTableWidget::dragEnterEvent(QDragEnterEvent* event) { const QTableWidget* source = qobject_cast(event->source()); if (source == this) { @@ -40,28 +30,44 @@ void CustomTableWidget::dragMoveEvent(QDragMoveEvent* event) return; } if (event->mimeData()->hasFormat("application/x-custom-data")) { - event->setDropAction(Qt::MoveAction); event->acceptProposedAction(); } else { event->ignore(); } } -void CustomTableWidget::startDrag(Qt::DropActions supportedActions) +void CustomTableWidget::mouseMoveEvent(QMouseEvent* event) { + if (!(event->buttons() & Qt::LeftButton)) { + return; + } + if ((event->pos() - startPos_).manhattanLength() < QApplication::startDragDistance()) { + return; + } + QDrag* drag = new QDrag(this); QMimeData* mimeData = new QMimeData; QStringList selectedTexts; foreach (QTableWidgetItem* item, selectedItems()) { - selectedTexts << item->text(); + if (item->column() == 1) { + selectedTexts << item->text(); + } } - mimeData->setData("application/x-custom-data", selectedTexts.join(",").toUtf8()); + mimeData->setData("application/x-custom-data", selectedTexts.join("|").toUtf8()); drag->setMimeData(mimeData); QPixmap pixmap(100, 50); pixmap.fill(Qt::lightGray); QPainter painter(&pixmap); painter.drawText(pixmap.rect(), Qt::AlignCenter, QString("%1 ITEM").arg(selectedTexts.count())); drag->setPixmap(pixmap); - drag->exec(supportedActions); + drag->exec(Qt::CopyAction | Qt::MoveAction); +} + +void CustomTableWidget::mousePressEvent(QMouseEvent* event) +{ + QTableWidget::mousePressEvent(event); + if (event->button() == Qt::LeftButton) { + startPos_ = event->pos(); + } } diff --git a/Gui/Control/cusTableWidget.h b/Gui/Control/cusTableWidget.h index ba7ff57..5d73e08 100644 --- a/Gui/Control/cusTableWidget.h +++ b/Gui/Control/cusTableWidget.h @@ -13,8 +13,12 @@ public: protected: void dropEvent(QDropEvent* event) override; - void dragMoveEvent(QDragMoveEvent *event) override; - void startDrag(Qt::DropActions supportedActions) override; + void dragEnterEvent(QDragEnterEvent* event); + void mouseMoveEvent(QMouseEvent* event) override; + void mousePressEvent(QMouseEvent* event) override; + +protected: + QPoint startPos_; }; #endif