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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • CSS的十八般技巧

    CSS的十八般技巧

  • Android P 新特性抢先看[通俗易懂]

          上周的世界移动通信大会上,我们看到了安卓开发者,设备生产者和芯片合作者组成的安卓生态系统不断的给用户代码惊喜的体验。      新特性下面就来看看AndroidP第一个预览版的一些很酷的特性。      1,Wi-Fi室内定位      精确的室内定位一直以来都是一个挑战,它给lbs创造了新的机遇。AndroidP支持了IEEE802.11mcWi-Fi协议,…

  • Readprocessmemory用法[通俗易懂]

    Readprocessmemory用法[通俗易懂]函数功能:该函数从指定的进程中读入内存信息,被读取的区域必须具有访问权限。 函数原型:BOOLReadProcessMemory(HANDLEhProcess,LPCVOIDlpBaseAddress,LPVOIDlpBuffer,DWORDnSize,LPDWORDlpNumberOfBytesRead); 参数:hProcess:进程句柄 lpBaseA

  • 对该信源编二进制香农码_编译原理实验一

    对该信源编二进制香农码_编译原理实验一一、实验目的和任务1.理解信源编码的意义;2.熟悉MATLAB程序设计;3.掌握香农编码的方法及计算机实现;4.对给定信源进行香农编码,并计算编码效率;二、实验原理介绍给定某个信源符号的概率分布,通过以下的步骤进行香农编码:1.信源符号按概率从大到小排列;12…….nppp≥≥≥2.确定满足下列不等式的整数码长iK为()()1iiilbpKl…

  • Macromedia flash制作落叶飘下动画

    Macromedia flash制作落叶飘下动画flash制作落叶动画打开MacromediaFlash软件,新建一个flash文档将所需所有素材导入到库中设置背景并将拖入到舞台的图片转换为图片元件设置落叶图层为图层2添加引导层,自定义枫叶下落路线轨迹。打开MacromediaFlash软件,新建一个flash文档将所需所有素材导入到库中使用“文件-导入-导入到库”命令将所有素材导入到库中。导入结果如下图设置背景并将拖入到舞台的图片转换为图片元件将库中的图片拖入到舞台中间,自动创建图层1,选中左侧工具栏中的“任意变形工具”,拖动过

  • vue slot插槽_笔记本内存条插槽显示4个

    vue slot插槽_笔记本内存条插槽显示4个为什么使用slotslot(插槽)在生活中很多地方都有插槽,电脑usb的插槽,插板当中的电源插槽插槽的目的是为了让我们原来的设备具备更多的扩展性比如电脑的USB我们可以插入U盘,手机,鼠标,键

发表回复

您的电子邮箱地址不会被公开。

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