Qt中自定义QTreeWidget实现节点拖拽复制功能
2023-09-14 09:05:27 时间
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;
};
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
#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);
}
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
相关文章
- Qt-获得网络状态(testNetOnIine)(Qt5.14.2+win10)
- Qt音视频开发26-监控画面各种图形绘制设计
- Qt编写自定义控件37-发光按钮(会呼吸的痛)
- Qt编写自定义控件57-直方波形图
- Qt编写云台仪表盘控件
- Qt开源作品39-日志输出增强版V2022
- Qt编写地图综合应用7-百度离线地图
- paip.c++ qt 目录遍历以及文件操作
- 【Qt】QModbusDevice类
- Qt 断言Q_ASSERT的使用
- Qt 读取csv文件并且绘制折线图
- Qt多线程编程实例
- 6、QT基础——对话框QDialog
- Qt之QSlider添加点击事件移动到指定位置(亲测可用)
- Qt 使用 curl
- QT中的相对位置,绝对位置之间的转换(maptoglobal,mapfromglobal)
- qt如何使用QString读取和保存中文字符?
- QT图片查看器封装-鼠标中心缩放、移动、截图、框选、切换播放
- Qt开发,编译报错:Cannot find file: xxx.pro.
- Qt发布程序,发布可执行文件exe