Qt拖放操作

Qt (高仿Visio)流程图组件开发(八) 流程图 鼠标拖动图元到场景(QGraphicsScene)创建 使用过Visio的都清楚,其图元可以通过拖动的方式创建到场景中。从QT的视角来开就是把一个图元对象从一个QWidget控件拖动创建到场景中,这里使用QDrag类进行实现。1、拖放是用户在应用程序中复制或移动数据的一种直观方式,并且在许多桌面环境中用作在应用程序之间复制数据的机制。2、Qt中的拖放支持以QDrag类为中心,此类处理拖放操作的大多数细节。3、通过拖放操作要传输的数据包含在QMimeData对象中。4、setMimeData()将QMimeData对象的所有权分配给QDrag对象。 阅读详情

“拖放操作”,顾名思义,就是由“拖动”和“放置”两个动作完成的。在Qt中,实现拖放的操作需要借助类QDrag和QDrop来完成。以下通过树形结构控件来描述Qt的拖放操作的过程。

1. 首先,需要设置自己的控件是支持拖放操作的,按照如下设置即可:

setDragEnabled(true);   //允许拖拽
setAcceptDrops(true);   //允许放置

2. 其次,我这个拖放操作是基于QTreeView来完成的,因此继承这个QTeeView之后还需要实现startDrag()这个函数。它可以被理解成是拖放操作的入口函数。

//开始拖拽事件
virtual void stratDrag(Qt::DropActions supportedAxtions);

//这个函数可以理解为拖放操作的入口函数。当拖放开始进行时,就会发现断点会进到这里。
void CMyTree::stratDrag(Qt::DropActions supportedAxtions)
{
	QDrag* pDrag = new QDrag(this);
	QMimeData* pMimeData = new QMimeData;
	QModelIndex index = currentIndex();
	
	if (pDrag && pMimeData)
	{
		pDrag->setMimeData(pMimeData);
		pDrag->exec(Qt::MoveAction);
	}
}

3. 接下来,拖放操作肯定是离不开鼠标的按压与移动的。因此还需要实现以下几个虚函数。

//鼠标点击事件
	virtual void mousePressEvent(QMouseEvent *event);
	//拖拽进入事件
	virtual void dragEnterEvent(QDragEnterEvent* event);
	//拖拽移动事件
	virtual void dragMoveEvent(QDragMoveEvent* event);
	//拖放事件
	virtual void dropEvent(QDropEvent *event);
	//鼠标松开事件
	virtual void mouseReleaseEvent(QMouseEvent *event);
	//鼠标移动事件
	virtual void mouseMoveEvent(QMouseEvent *event);
	//鼠标悬停事件
	virtual bool viewportEvent(QEvent *event);

当一切准备工作完成后,再通过QTreeView与QStandardItemModel相结合,完成一些列的拖放操作。本例大致需求是:将叶子节点拖放到不同组织下。整个源码如下:

//CMyTree.h
#pragma once
#include <QTreeView>
#include <QStandardItem>

class CMyTree :
	public QTreeView
{
public:
	CMyTree(QWidget* parent = nullptr);
protected:
	//开始拖拽事件
	virtual void stratDrag(Qt::DropActions supportedAxtions);
	//鼠标点击事件
	virtual void mousePressEvent(QMouseEvent *event);
	//拖拽进入事件
	virtual void dragEnterEvent(QDragEnterEvent* event);
	//拖拽移动事件
	virtual void dragMoveEvent(QDragMoveEvent* event);
	//拖放事件
	virtual void dropEvent(QDropEvent *event);
	//鼠标松开事件
	virtual void mouseReleaseEvent(QMouseEvent *event);
	//鼠标移动事件
	virtual void mouseMoveEvent(QMouseEvent *event);
	//鼠标悬停事件
	virtual bool viewportEvent(QEvent *event);
private:
	QStandardItem* m_pDragItem;
	QStandardItem* m_pDropItem;
};
//CMyTree.cpp
#include "CMyTree.h"
#include <QDrag>
#include <QMimeData>
#include <QStandardItemModel>
#include <QMouseEvent>

CMyTree::CMyTree(QWidget* parent /* = nullptr */)
	: QTreeView(parent)
	, m_pDragItem(nullptr)
	, m_pDropItem(nullptr)
{
	setDropIndicatorShown(true);
	setHeaderHidden(true);  //隐藏表头
	setDragEnabled(true);   //允许拖拽
	setAcceptDrops(true);   //允许放置
}

void CMyTree::stratDrag(Qt::DropActions supportedAxtions)
{
	QDrag* pDrag = new QDrag(this);
	QMimeData* pMimeData = new QMimeData;
	QModelIndex index = currentIndex();
	
	if (pDrag && pMimeData)
	{
		pDrag->setMimeData(pMimeData);
		pDrag->exec(Qt::MoveAction);
	}
}

void CMyTree::mousePressEvent(QMouseEvent *event)
{
	if (Qt::RightButton == event->button())
	{
		setDragEnabled(false);
	}
	else if (Qt::LeftButton == event->button())
	{
		setDragEnabled(true);
	}
	QTreeView::mousePressEvent(event);
}

void CMyTree::dragEnterEvent(QDragEnterEvent* event)
{
	if (event->mimeData())
	{
		QStandardItemModel* pModel = (QStandardItemModel*)(this->model());
		QPoint mousePos = event->pos();
		QModelIndex localIndex = indexAt(mousePos);
		m_pDragItem = pModel->itemFromIndex(localIndex);
		QString strData = localIndex.data(Qt::DisplayRole).toString();
		QRect rect = visualRect(localIndex);
		event->accept();
	}
}

void CMyTree::dragMoveEvent(QDragMoveEvent* event)
{
	if (event->mimeData())
	{
		update();
		event->accept();
	}
}

void CMyTree::dropEvent(QDropEvent *event)
{
	QStandardItemModel* pModel = (QStandardItemModel*)(this->model());
	QPoint mousePos = event->pos();
	QModelIndex localIndex = indexAt(mousePos);
	m_pDropItem = pModel->itemFromIndex(localIndex);
	QString strData = localIndex.data(Qt::DisplayRole).toString();
	QRect rect = visualRect(localIndex);

	//同组织下释放没效果
	QStandardItem* pDragItemParent = m_pDragItem->parent();
	QStandardItem* pDropItemParent = m_pDropItem->parent();
	if (pDragItemParent == pDropItemParent)
	{
		return;
	}
	else if (pDragItemParent && pDropItemParent)
	{
		QStandardItem* pItem = new QStandardItem(m_pDragItem->data(Qt::DisplayRole).toString());
		pDropItemParent->appendRow(pItem);
	}
	update();
}

void CMyTree::mouseReleaseEvent(QMouseEvent *event)
{
	QTreeView::mouseReleaseEvent(event);
}

void CMyTree::mouseMoveEvent(QMouseEvent *event)
{
	QTreeView::mouseMoveEvent(event);
}

bool CMyTree::viewportEvent(QEvent *event)
{
	return QTreeView::viewportEvent(event);
}
//CMyApp.h
#pragma once

#include <QtWidgets/QWidget>
#include <QStandardItemModel>
#include "ui_CMyApp.h"

class CMyApp : public QWidget
{
	Q_OBJECT

public:
	CMyApp(QWidget *parent = Q_NULLPTR);
	void InitUI();

private:
	Ui::CMyAppClass ui;
	QStandardItemModel* m_pModel;
};
//CMyApp.cpp
#include "CMyApp.h"
#include <QStandardItem>

CMyApp::CMyApp(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
	m_pModel = new QStandardItemModel(ui.treeView);
	InitUI();
}

void CMyApp::InitUI()
{
	QStandardItem* pItem1 = new QStandardItem(QStringLiteral("法师"));
	m_pModel->appendRow(pItem1);
	QStandardItem* pItem1_1 = new QStandardItem(QStringLiteral("妲己"));
	QStandardItem* pItem1_2 = new QStandardItem(QStringLiteral("小乔"));
	QStandardItem* pItem1_3 = new QStandardItem(QStringLiteral("西施"));
	pItem1->appendRow(pItem1_1);
	pItem1->appendRow(pItem1_2);
	pItem1->appendRow(pItem1_3);

	QStandardItem* pItem2 = new QStandardItem(QStringLiteral("法刺"));
	m_pModel->appendRow(pItem2);
	QStandardItem* pItem2_1 = new QStandardItem(QStringLiteral("不知火舞"));
	QStandardItem* pItem2_2 = new QStandardItem(QStringLiteral("貂蝉"));
	QStandardItem* pItem2_3 = new QStandardItem(QStringLiteral("上官婉儿"));
	pItem2->appendRow(pItem2_1);
	pItem2->appendRow(pItem2_2);
	pItem2->appendRow(pItem2_3);

	ui.treeView->setModel(m_pModel);
}

//main.cpp
#include "CMyApp.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	CMyApp w;
	w.show();
	return a.exec();
}

【Qt】Qt中的拖放操作实现——拖放文件以及自定义拖放操作 实现Qt中的拖放操——拖放文件以及自定义拖放操作 阅读详情

相关推荐

Qt编写可拖拽的自定义控件

qt实现的可自定义拖拽控件

qq_37033647的博客 5070

Qt中自定义控件拖拽,QT实现拖拽功能--小白友好版

大致步骤就是重写QLabel=>使用自己写的控件=>在主窗口中设置允许鼠标放下动作。然后就是Qt开发任重道远,加油吧!!httpshttpst=M666httpst=M666httpshttpshttpshttpsQt拖拽,官方文档httpsMimaData文档https。

qq_43710667的博客 1万+

Qt应用程序主窗口:拖放操作与打印文档

书中还有一个在窗口中拖动图片的例子,就是在窗口中有一个图片,可以随意拖动它。这里需要使用到自定义的MIME类型。(项目源码路径:src\05\5-8\imageDrag|Drop)。这里由于篇幅原因,就不再详细说明了。

QtCompany的博客 373

使用QT进行简单的控件拖拽

通过QT实现对控件的拖拽移动操作

weixin_43699794的博客 2810

【QT开发教程】Qt中的拖放操作与数据传输

拖放操作是现代图形用户界面(GUI)中的常见交互方式,用户可以通过拖放来移动或复制数据。Qt提供了强大的拖放操作支持,使开发者能够轻松实现这一功能。本文将介绍Qt中的拖放操作与数据传输,包括基本概念、实现方法和实际示例。

科技改变人类,技术成就未来 816

掌握Qt中的拖放操作

本文深入探讨了Qt中实现拖放功能的方法,包括处理文件拖拽的QUriDrag类,以及如何通过自定义事件处理程序和类来支持自定义拖放类型。文章还介绍了如何使用QDragObject及其子类来创建支持多种MIME类型的数据拖放。此外,还探讨了高级剪贴板处理技巧。

weixin_28721743的博客 369

QT中QTreeWidget的拖放操作

在学习Qt的过程中接触过QListWidget和QTextWidget的拖放操作,现QT项目实操需用到树形节点拖放的操作,在参考了教程与案例后,做个实践小Demo: class TreeWidget : public QTreeWidget { Q_OBJECT public: explicit TreeWidget(QWidget *parent = nullptr); ...

先闻其声的博客 8381

掌握Qt自定义拖放操作:QDrag类实践指南

本文还有配套的精品资源,点击获取 简介:Qt框架中的拖放操作允许用户通过鼠标在控件间移动数据,本教程着重讲解如何使用 QDrag 类来创建自定义拖放功能。 QDrag 类负责拖动操作的视觉效果及数据传输,通常与 QMimeData 配合使用。文章涵盖了创建 QDrag 对象、处理拖动事件以及目标控件中处理拖放数据的方法...

weixin_42476987的博客 2142

Qt拖放事件与拖放操作

启动拖动操作需要创建一个QDrag对象描述拖动操作,以及创建一个QMimeData类的对象用于存储拖动操作的格式信息和数据,并将其赋值为QDrag对象的mimeData属性。当拖动操作移动到放置点时,首先触发dragEnterEvent()事件处理函数,此函数中一般要通过QDrag对象的mimeData数据判断拖动操作的来源和参数,以确定是否接受放置操作。QUrl::path()返回的路径,返回“/C:/Users/Leo/Desktop/飞机.jpg”,需要注意的是开头有一个额外的“/”。

m0_73670179的博客 483

Qt 实现拖拽效果

Qt qml 实现拖拽效果

卡诺图化简法

目录 1.学前需要了解知识点 2.卡诺图(karnaugh map) 3.逻辑函数的卡诺图化简法 4.总结 1.学前需要了解知识点 最小项的定义 最小项的表示方法 最小项的相邻性 最小项的定义:一个函数的某个乘积项包含了函数的全部变量,其中每个变量都以原变量或反变量的形式出现,且仅出现一次,则这个乘积项称为该函数的一个标准积项,通常称为最小项。 最小项的表示方法:通常用来表...

hahasusu的专栏 17万+

Qt--拖放操作

Qt–拖放操作 1 使用拖放打开文件 将桌面上的.txt文件拖入程序打开。 新建Widget项目,项目名称为mydragdrop,类名和积累保持MainWindow和QMainWindow不变。建立完项目后,往界面上拖入一个Text Edit部件。然后在mainwindow.h文件中添加函数声明: protected: void dragEnterEvent(QDragEnterEvent *event); // 拖动进入事件 void dropEvent(QDropEvent *event

web15085181368的博客 2044

BCC Python开发教程&常用BCC工具(一)

这个教程主要目的是展示如何使用python来进行bcc工具开发和编程。教程主要分为两个部分:可观察性和网络。文中的代码片段均都来自于bcc:代码片段的licenses见bcc中具体文件。也可参考bcc开发者手册以及end-users工具教程:。此外bcc还开放有lua接口。

hudongliang2006nb的专栏 2086

Qt拖放操作和打印操作

Qt 拖放操作和打印操作1. 拖放操作1.1 使用拖放打开文件1.2 自定义拖放操作2. 打印操作 1. 拖放操作 1.1 使用拖放打开文件 1.2 自定义拖放操作 2. 打印操作

MechMaster 1441

【git】win 10 / win 11:git 首次拉取云效平台代码详细教程

git 首次拉取云效平台代码详细教程:Git 生成 SSH 公钥、云效工作台添加 SSH 公钥、git 使用 SSH / HTTP 链接拉取云效代码

顾三殇 —— 博客空间(软件测试) 4218

qt 之拖放操作-自定义拖放操作

自定义拖放操作案例---在应用程序主窗口里面拖动图片显示到任意位置如下几步骤: 鼠标按下事件 获取图片 自定义MIME类型 将数据放入QMimeData中 将QMimeData数据放入QDrag中 给原图片添加阴影 执行放下操作 拖动进入事件 拖动事件 放下事件 { ui->setupUi(this); setAcceptDrops(t...

网瘾少年丶的博客 1215

《手把手教你修复过期K8s集群证书:记一次K8s集群起死回生实录》

今天本想打开半年前部署的K8s测试集群跑个Demo,结果`kubectl`直接报错`certificate has expired`!作为一名云原生老司机,我决定把这次'抢救'过程记录下来,手把手带大家解决这个运维常见问题。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 3779

qt 之拖放操作-打印文档

{ ui->setupUi(this); QAction *acton_print = new QAction("打印",this); QAction *acton_printPreview = new QAction("打印预览",this); QAction *acton_pdf = new QAction("生成pdf",this); co...

网瘾少年丶的博客 374

抖音无水印视频爬虫实战:从抓包分析到批量下载指定用户作品

抖音作为当前最受欢迎的短视频平台,拥有海量的优质内容。很多用户希望备份自己或他人的作品,但抖音官方并未提供批量下载功能,且直接下载的视频带有平台水印。本文将带领大家从零开始,通过抓包分析、设备模拟、请求签名等核心技术,实现一个完整的抖音无水印视频爬虫系统。本文仅供技术学习和个人备份使用,请勿将爬取的内容用于商业用途或侵犯他人版权,爬取频率请控制合理范围内。目录一、前言二、技术栈概览三、准备工作3.1 环境搭建3.2 抓包分析步骤3.3 关键API发现四、核心技术解密4.1 X-Gorgon签名算法。

2201_76125261的博客 846

AI自瞄原理剖析(四)从Yolo推理坐标到屏幕坐标:基于FOV视角与焦距的坐标变换与精准瞄准

从Yolo推理框架得到的坐标到屏幕坐标的转换是一个涉及到FOV视角、焦距以及分辨率的复杂过程。通过数学公式,我们可以将推理框坐标反推为游戏内的实际坐标,并最终映射到屏幕坐标系中。利用这些信息,AI自瞄系统能够精确计算出准星从当前位置移动到敌人位置的距离,实现精准的自动瞄准。通过这种方法,AI自瞄系统能够在不同的游戏环境下灵活应对,提供高度精确的操作体验。在AI自瞄系统中,目标检测仅仅是第一步,获取到预测框的坐标后,我们还需要将这些坐标转换为实际屏幕上的精确位置。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1334

QT6(拖放事件与拖放操作)

QT6拖放操作与MIME数据处理摘要 本文介绍了QT6中拖放操作的核心机制和MIME数据处理方法。MIME(多用途互联网邮件扩展)是数据传输的标准格式,QT通过QMimeData类实现拖放和剪贴板操作。文章详细列出了常见MIME类型(如text/plain、text/uri-list等)及其应用场景,并提供了完整的代码示例展示如何实现文件拖放功能。示例中通过重写dragEnterEvent和dropEvent处理拖放事件,验证文件类型并显示拖入的图片。文中还包含MIME类型参考表格,涵盖文本、图像、文件和自

weixin_43754657的博客 352

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Qt中实现拖放操作

对于一个实用的应用程序,不仅希望能从文件菜单中打开一个文件,更希望可以通过拖动,直接将桌面上的文件拖入程序界面来打开,这里有一个简单的例子,将桌面上的文本文件拖入程序中打开:main.cpp#include "mainwindow.h"#include &lt;QApplication&gt;int main(int argc, char *argv[]){    QApplication a(a...

LittleXingXingC的博客 647

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

QT6(54)6.4 拖放事件与拖放操作:本节例题程序是支持对电脑中图片的拖放操作,并显示图片。

(189)(190)

zhangzhangkeji的博客 296

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Qt:拖放操作和剪贴板

一、拖放操作: 为了开始一个拖动,要创建一个QDrag对象,然后调用它的start()函数,在窗口部件的mousePressEvent()中开始 一个拖放操作,代码框架如下: void MainWindow::mousePressEvent(QMouseEvent *event){     if(event->button() == Qt::LeftButton){         QD

yangchuankai's blog 2125
上一篇: 数据结构_双向循环链表的基本实现
下一篇: 最简易的Qt白板绘图功能
Romeo  i
博客等级 码龄9年 151粉丝 80原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值