Qt QTreeWidget DragDrop的使用之二

在这里插入图片描述
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

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值