Qt中自定义QTreeWidget实现节点拖拽复制功能[通俗易懂]

Qt中自定义QTreeWidget实现节点拖拽复制功能[通俗易懂]QT中在QWidget支持拖拽功能,QTreeWidget继承自QWidget,所以自然也具有节点的拖拽功能。拖拽包含两个功能:一个是拖动(Drag),一个是放下(Drop)。拖动的数据是QMimeData数据,MIME数据定义格式:类型/数据(注意中间有斜线)。若被拖动的对象放下的控件,不接受拖动的对象,Qt光标显示禁用的形状(一个禁用形状)。开始拖动:通过调用QDrag::exec()…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

QT中在QWidget支持拖拽功能,QTreeWidget继承自QWidget,所以自然也具有节点的拖拽功能。

拖拽包含两个功能:一个是拖动(Drag),一个是放下(Drop)。拖动的数据是QMimeData数据,MIME数据定义格式:类型/数据 (注意中间有斜线)。

若被拖动的对象放下的控件,不接受拖动的对象,Qt光标显示禁用的形状(一个禁用形状)。

开始拖动:通过调用QDrag::exec()函数启动,该函数是一个阻塞函数(但不会阻塞主事件循环),这意味着在拖放操作结束之前,不会返回该函数;通过调用setAcceptDrops()函数可设置控件是否接受放下事件。
QDragEnterEvent:拖动进入事件
QDragMoveEvnet:拖动移动事件
QDropEvent:放下事件
QDragLeaveEvent:当拖放操作离开控件时发送该事件

下面是一个实例,在树形控件中,拖动节点,并且被拖动的内容放大显示:
在这里插入图片描述

拖动的TreeWidget:

#pragma once

#include <QTreeWidget>

class QMouseEvent;
class QTreeWidgetItem;

class DragTreeWidget : public QTreeWidget { 
   
	Q_OBJECT

public:
	DragTreeWidget(QWidget *parent);
	~DragTreeWidget();

private:
	void init();
private:

	virtual void mousePressEvent(QMouseEvent *event)override;

private:
	QTreeWidgetItem* _selectItem = nullptr;
};
#include "DragTreeWidget.h"

#include <QMouseEvent>
#include <QTreeWidgetItem>
#include <QByteArray>
#include <QDataStream>
#include <QMimeData>
#include <QDrag>
#include "QtGuiDrag.h"

DragTreeWidget::DragTreeWidget(QWidget *parent)
	: QTreeWidget(parent) { 
   
	init();
	setDragDropMode(QAbstractItemView::InternalMove);
	setDragEnabled(true);
}

DragTreeWidget::~DragTreeWidget() { 
   

}

void DragTreeWidget::init() { 
   
	QTreeWidgetItem* topItem = new QTreeWidgetItem(this);
	topItem->setText(0, QStringLiteral("阳光小区"));
	QTreeWidgetItem* item1 = new QTreeWidgetItem(topItem);
	item1->setText(0, QStringLiteral("王天天"));
	QTreeWidgetItem* item2 = new QTreeWidgetItem(topItem);
	item2->setText(0, QStringLiteral("刘一一"));
	topItem->setExpanded(true);

	QTreeWidgetItem* topItem2 = new QTreeWidgetItem(this);
	topItem2->setText(0, QStringLiteral("幸福小区"));
	QTreeWidgetItem* item3 = new QTreeWidgetItem(topItem2);
	item3->setText(0, QStringLiteral("赵鑫"));
	QTreeWidgetItem* item4 = new QTreeWidgetItem(topItem2);
	item4->setText(0, QStringLiteral("王旭"));
	topItem2->setExpanded(true);
}

void DragTreeWidget::mousePressEvent(QMouseEvent *event) { 
   
	if (event->button()&Qt::LeftButton){ 
   
		_selectItem = itemAt(event->pos());

		QByteArray dataItem;
		QDataStream dataStream(&dataItem, QIODevice::WriteOnly);
		dataStream << _selectItem->text(0);

		QMimeData* mimeData = new QMimeData;
		mimeData->setData("Data/name", dataItem);

		QtGuiDrag* dragPiamap = new QtGuiDrag(nullptr);
		dragPiamap->setShowText(_selectItem->text(0));
		QPixmap pixmap = dragPiamap->grab();

		QDrag* drag = new QDrag(this);
		drag->setPixmap(pixmap);
		drag->setMimeData(mimeData);
		drag->setHotSpot(QPoint(pixmap.width() / 2, pixmap.height() / 2));

		drag->exec(Qt::MoveAction);
	}
	QTreeWidget::mousePressEvent(event);
}

放下的TreeWidget

#pragma once

#include <QTreeWidget>

class DropTreeWidget : public QTreeWidget { 
   
	Q_OBJECT

public:
	DropTreeWidget(QWidget *parent);
	~DropTreeWidget();

	void dragEnterEvent(QDragEnterEvent *event)override;
	void dropEvent(QDropEvent *event)override;
private:
	void init();
};

#include "DropTreeWidget.h"
#include <QTreeWidgetItem>
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QMimeData>

DropTreeWidget::DropTreeWidget(QWidget *parent)
	: QTreeWidget(parent) { 
   
	init();
}

DropTreeWidget::~DropTreeWidget() { 
   
}

void DropTreeWidget::dragEnterEvent(QDragEnterEvent *event) { 
   
	if (event->mimeData()->hasFormat("Data/name")){ 
   
		if (event->source() == this){ 
   
			event->setDropAction(Qt::MoveAction);
			event->accept();
		} else { 
   
			event->acceptProposedAction();
		}
	} else { 
   
		event->ignore();
	}
}

void DropTreeWidget::dropEvent(QDropEvent *event) { 
   
	if (event->mimeData()->hasFormat("Data/name")) { 
   
		//获取拖拽时设置的数据
		QByteArray itemData = event->mimeData()->data("Data/name");
		QDataStream dataStream(&itemData, QIODevice::ReadOnly);

		QString text;
		dataStream >>text;

		QTreeWidgetItem *item = itemAt(event->pos()); //当前位置的item
		if (item == nullptr) { 
    
			return;
		}
		QTreeWidgetItem* newItem = new QTreeWidgetItem(item);
		newItem->setText(0, text);
		item->setExpanded(true);

		if (event->source() == this) { 
   
			event->setDropAction(Qt::MoveAction);
			event->accept();
		} else { 
   
			event->acceptProposedAction();
		}
	} else { 
   
		event->ignore();
	}
}

void DropTreeWidget::init() { 
   
	setDragDropMode(QAbstractItemView::InternalMove);

	QTreeWidgetItem* topItem = new QTreeWidgetItem(this);
	topItem->setText(0, QStringLiteral("一班"));

	QTreeWidgetItem* topItem1 = new QTreeWidgetItem(this);
	topItem1->setText(0, QStringLiteral("二班"));
}

拖动时显示的图片界面:

#pragma once

#include <QWidget>
#include "ui_QtGuiDrag.h"

//拖动时的图片显示

class QtGuiDrag : public QWidget { 
   
	Q_OBJECT

public:
	QtGuiDrag(QWidget *parent = Q_NULLPTR);
	~QtGuiDrag();

	void setShowText(QString text);
private:
	Ui::QtGuiDrag ui;
};

#include "QtGuiDrag.h"

QtGuiDrag::QtGuiDrag(QWidget *parent)
	: QWidget(parent) { 
   
	ui.setupUi(this);

	this->setWindowFlags(Qt::FramelessWindowHint);
	this->setAttribute(Qt::WA_TranslucentBackground, true);
}

QtGuiDrag::~QtGuiDrag() { 
   
}

void QtGuiDrag::setShowText(QString text) { 
   
	ui.label->setText(text);
}

在这里插入图片描述

aaa

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187311.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • tomcat官网如何下载低版本的tomcat

    tomcat官网如何下载低版本的tomcat

    2021年7月17日
    81
  • navicat永久激活码最新【2021最新】[通俗易懂]

    (navicat永久激活码最新)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlKUKQYKZ5XE-eyJsaWNlbnNlSW…

    2022年3月22日
    399
  • Git教程 SSH keys配置[通俗易懂]

    SSH为SecureShell的缩写,由IETF的网络小组(NetworkWorkingGroup)所制定;SSH为建立在应用层基础上的安全协议。在管理Git项目上,有两种克隆到本地的方法。直接使用httpsurl克隆到本地使用SSHurl克隆到本地  这两种方式的主要区别在于:使用httpsurl克隆对初学者来说会比较方便,复制http…

    2022年4月11日
    62
  • win11 修改host文件[通俗易懂]

    win11 修改host文件[通俗易懂]转到“开始”菜单搜索栏,输入“记事本”,然后以管理员身份运行记事本。单击文件并从菜单中选择“打开…”选项。在“文件名:”选项中输入主机文件地址(C:\Windows\System32\drivers\etc\hosts),然后单击“打开”。选择打开所有文件可以看到host文件在您的记事本上打开Host文件,然后您可以从这里对其进行编辑。输入IP地址和域名以配置映射。保存修改注意查看保存的文件类型为所有文件提示替换同意之后退出完成修改…

    2022年10月12日
    0
  • docker更换默认存储目录、默认存储目录磁盘剩余空间不足,采用软连、换目录、加容量解决

    docker更换默认存储目录、默认存储目录磁盘剩余空间不足,采用软连、换目录、加容量解决

    2021年6月4日
    126
  • 22、Windows10下局域网的两台电脑间传输文件

    22、Windows10下局域网的两台电脑间传输文件一、说明局域网内两台电脑传输文件使用windows自带的文件共享机制即可,不需要找专门的文件传输软件,下面来介绍使用方法。二、步骤1、控制面板2、网络和Internet3、网络和共享中心4、记住网络类型并点击更改高级共享设置5、根据对应的网络类型,在其下选择启用网络发现6、设置所有网络如下7、随便找一个文件夹设置为共享,这里在桌面新建一个名为“共享”的文件夹作文测试8、右击->属性->共享9、在其它电脑上访问自己的的文件夹,假设共享文件夹所在主机IP

    2022年5月4日
    339

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号