1.设置主界面布局,分别提升两个控件
2.Drag控件
#pragma once
#include <QTreeWidget>
class QtTreeDrag : public QTreeWidget {
Q_OBJECT
public:
QtTreeDrag(QWidget *parent);
~QtTreeDrag();
private:
void mousePressEvent(QMouseEvent *e)override;
void dragMoveEvent(QDragMoveEvent *event)override;
};
#include <QMouseEvent>
#include <QByteArray>
#include <QDrag>
#include <QLabel>
#include <QDragMoveEvent>
#include "QtTreeDrag.h"
#include "MyMimeData.h"
#include "QtGuiDrag.h"
QtTreeDrag::QtTreeDrag(QWidget *parent)
: QTreeWidget(parent) {
}
QtTreeDrag::~QtTreeDrag() {
}
void QtTreeDrag::mousePressEvent(QMouseEvent *event) {
QTreeWidgetItem*_selectItem = this->itemAt(event->pos());
if (event->button() == Qt::LeftButton&&_selectItem){
QByteArray dataItem;
QDataStream dataStream(&dataItem, QIODevice::WriteOnly);
dataStream << _selectItem->text(0);
//设置自定义数据
MyMimeData* mimeData = new MyMimeData;
mimeData->setTreeItem(_selectItem);
mimeData->setData("Data/name", dataItem);
QtGuiDrag* guiDrag = new QtGuiDrag;
guiDrag->showText(_selectItem->text(0));
QPixmap pixmap = guiDrag->grab();
//拖动设置
QDrag* drag = new QDrag(this);
drag->setPixmap(pixmap);
drag->setMimeData(mimeData);
drag->setHotSpot(QPoint(pixmap.width() / 2, pixmap.height() / 2));
Qt::DropAction dropAction = drag->exec(Qt::MoveAction | Qt::CopyAction, Qt::CopyAction);
}
QTreeWidget::mousePressEvent(event);
}
void QtTreeDrag::dragMoveEvent(QDragMoveEvent *event) {
if (event->mimeData()->hasFormat("Data/name")) {
//children()返回所有子对象,ev->sourve返回当前拖拽的对象
if (children().contains(event->source())) {
event->setDropAction(Qt::MoveAction);
event->accept();
} else {
event->acceptProposedAction();
}
} else {
event->ignore();
}
}
3.Drop控件
#pragma once
#include <QTreeWidget>
class QtTreeDrop : public QTreeWidget {
Q_OBJECT
public:
QtTreeDrop(QWidget *parent);
~QtTreeDrop();
private:
void dragEnterEvent(QDragEnterEvent *event)override;
void dragMoveEvent(QDragMoveEvent *event)override;
void dropEvent(QDropEvent *event)override;
};
#include <QDragEnterEvent>
#include <QDragMoveEvent>
#include "MyMimeData.h"
#include "QtTreeDrop.h"
QtTreeDrop::QtTreeDrop(QWidget *parent)
: QTreeWidget(parent) {
//允许接受drop操作
setAcceptDrops(true);
}
QtTreeDrop::~QtTreeDrop() {
}
void QtTreeDrop::dragEnterEvent(QDragEnterEvent *event) {
QTreeWidget *source = qobject_cast<QTreeWidget *>(event->source());
if (source ) {
event->accept();
}
}
void QtTreeDrop::dragMoveEvent(QDragMoveEvent *event) {
if (event->mimeData()->hasFormat("Data/name")) {
event->acceptProposedAction();
} else {
event->ignore();
}
}
void QtTreeDrop::dropEvent(QDropEvent *event) {
QWidget *source = qobject_cast<QTreeWidget *>(event->source());
MyMimeData *pMimeData =(MyMimeData *)(event->mimeData());
if (source) {
QTreeWidgetItem *item = pMimeData->getTreeItem();
QTreeWidgetItem *pItem = item->clone();
QTreeWidgetItem *currentItem = this->itemAt(event->pos());
QTreeWidgetItem* subItem = new QTreeWidgetItem(currentItem);
subItem->setText(0, item->text(0));
currentItem->setExpanded(true);
event->accept();
}
}
4.图片控件
#pragma once
#include <QWidget>
#include "ui_QtGuiDrag.h"
class QtGuiDrag : public QWidget {
Q_OBJECT
public:
QtGuiDrag(QWidget *parent = Q_NULLPTR);
~QtGuiDrag();
void showText(QString text);
private:
Ui::QtGuiDrag ui;
};
#include "QtGuiDrag.h"
QtGuiDrag::QtGuiDrag(QWidget *parent)
: QWidget(parent) {
ui.setupUi(this);
}
QtGuiDrag::~QtGuiDrag() {
}
void QtGuiDrag::showText(QString text) {
ui.label->setText(text);
}
5.自定义的MimeData
#pragma once
#include <QMimeData>
class QTreeWidgetItem;
class MyMimeData : public QMimeData {
Q_OBJECT
public:
MyMimeData();
~MyMimeData();
void setTreeItem(QTreeWidgetItem* item) {
_item = item;
}
QTreeWidgetItem* getTreeItem() {
return _item;
}
private:
QTreeWidgetItem* _item = nullptr;
};
#include "MyMimeData.h"
MyMimeData::MyMimeData() {
}
MyMimeData::~MyMimeData() {
}
aaa