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

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

自定义拖放操作案例---在应用程序主窗口里面拖动图片显示到任意位置如下几步骤:

  1. 鼠标按下事件
    1. 获取图片
    2. 自定义MIME类型
    3. 将数据放入QMimeData中
    4. 将QMimeData数据放入QDrag中
    5. 给原图片添加阴影
    6. 执行放下操作
  2. 拖动进入事件
  3. 拖动事件
  4. 放下事件
    {
        ui->setupUi(this);
        setAcceptDrops(true);//设置窗口部件可以接收拖入
    
        QLabel *label = new QLabel(this);
        QPixmap pix("../imagedragdrop12/111.png");
        label->setPixmap(pix);
        label->resize(pix.size());
        label->move(100,100);
        label->setAttribute(Qt::WA_DeleteOnClose);//当窗口关闭时销毁图片
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    //鼠标按下事件
    void MainWindow::mousePressEvent(QMouseEvent *event)
    {
        //(1)获取图片
        //将鼠标指针所在位置的部件强制转换为QLabel类型
        QLabel *child = static_cast<QLabel*>(childAt(event->pos()));
        if(!child->inherits("QLabel"))//如果部件不是QLabel则直接返回
            return;
        QPixmap pixmap = *child->pixmap();//获取QLabel中的图片
    
        //(2)自定义MIME类型
        QByteArray itemData;//创建字节数组
        QDataStream dataSteam(&itemData,QIODevice::WriteOnly);//创建数据流
        //将图片信息,位置信息输入到字节数组中
        dataSteam<<pixmap<<QPoint(event->pos()-child->pos());
    
        //(3)将数据放入QMimeData中
        QMimeData *mimeData = new QMimeData;//创建QMimeData用来存放要移动的数据
        //将字节数组放入QMimeData中,这里的MIME类型是我们自己定义的
        mimeData->setData("myimage/png",itemData);
    
        //(4)将QMimeData数据放入QDrag中
        QDrag *drag = new QDrag(this);//创建QDrag,它用来移动数据
        drag->setMimeData(mimeData);
        drag->setPixmap(pixmap);//在移动过程中显示图片,若不设置默认显示一个小矩形
        drag->setHotSpot(event->pos()-child->pos());//拖动时鼠标指针的位置不变
    
        //(5)给原图片添加阴影
        QPixmap temPixmap = pixmap;//使原图片添加阴影
        QPainter painter; //创建QPainter,用来绘制QPixmap
        painter.begin(&temPixmap);
        //在图片的外接矩形中添加一层透明的淡黑色形成阴影效果
        painter.fillRect(pixmap.rect(),QColor(127,127,127,127));
        painter.end();
        //在移动图片过程中,让原图片添加一层黑色阴影
        child->setPixmap(temPixmap);
    
        //(6)执行放下操作
        if(drag->exec(Qt::CopyAction | Qt::MoveAction,Qt::CopyAction) == Qt::MoveAction)
            child->close();
        else{
            child->show();
            child->setPixmap(pixmap);//显示原图片,不再使用阴影
        }
    }
    
    //拖动进入事件
    void MainWindow::dragEnterEvent(QDragEnterEvent *event)
    {
        //如果有我们定义的MIME类型数据,则进行移动操作
        if(event->mimeData()->hasFormat("myimage/png"))
        {
            event->setDropAction(Qt::MoveAction);
            event->accept();
        }else
            event->ignore();
    }
    
    //拖动事件
    void MainWindow::dragMoveEvent(QDragMoveEvent *event)
    {
        //如果有我们定义的MIME类型数据,则进行移动操作
        if(event->mimeData()->hasFormat("myimage/png"))
        {
            event->setDropAction(Qt::MoveAction);
            event->accept();
        }else
            event->ignore();
    }
    
    //放下事件
    void MainWindow::dropEvent(QDropEvent *event)
    {
        //如果有我们定义的MIME类型数据
        if(event->mimeData()->hasFormat("myimage/png"))
        {
            QByteArray itemData = event->mimeData()->data("myimage/png");
            QDataStream dataStream(&itemData,QIODevice::ReadOnly);
            QPixmap pixmap;
            QPoint offset;
    
            dataStream>>pixmap>>offset;
            //新建标签,为其添加图片,并根据图片大小设置标签的大小
            QLabel *newLabel = new QLabel(this);
            newLabel->setPixmap(pixmap);
            newLabel->resize(pixmap.size());
            //让图片移动到放下的位置,不设置的话,图片会默认在(0,0)点
            newLabel->move(event->pos()-offset);
            newLabel->show();
            newLabel->setAttribute(Qt::WA_DeleteOnClose);
            event->setDropAction(Qt::MoveAction);
            event->accept();
        }else
            event->ignore();
    }
    

 

Qt5.14.2 大神的拖放艺术,优雅而强大的交互体验 作为图形界面软件,良好的用户交互体验是制胜的关键。而在Qt大神们的绝世编程之道中,拖放操作无疑占据着非常重要的一席之地。它不仅操作简单直观,而且可以完成大量看似复杂的任务,是提升用户体验质量的利器。今天,就让我们一同欣赏Qt大神们在这一领域的绝妙功力吧! 阅读详情

相关推荐

使用QDrag类实现拖放功能

上面的例子中,我们创建了一个自定义QWidget控件,并将其设置为接受拖放事件(通过调用setAcceptDrops(true))。在这个操作中,我们创建了一个QMimeData对象,将要传输的数据放入其中,然后把它设置到QDrag对象中。当我们将QDrag对象拖放到目标控件上时,目标控件可以从QMimeData对象中获取我们传输的数据。当我们将一个QDrag对象放置在目标控件上时,目标控件可以从QDrag对象中获取我们传输的数据。最后,在dropEvent()函数中,我们获取拖拽的数据,并进行一些处理。

CodeNexus的博客 375

Qt学习之路(52): 拖放技术之一

拖放 Drag and Drop,有时又被称为 DnD,是现代软件开发中必不可少的一项技术。它提供了一种能够在应用程序内部甚至是应用程序之间进行信息交换的机制,并且,操作系统与应用程序之间进行剪贴板的内容交换,也可以被认为是 DnD 的一部分。 DnD 其实是由两部分组成的:Drag 和 Drop。Drag 是将被拖放对象“拖动”,Drop 是将被拖放对象“放下”,前者一般...

weixin_34303897的博客 338

QT拖放事件之五:自定义拖放操作-拖动中的修饰符操作

【代码】QT拖放事件之五:自定义拖放操作-拖动中的修饰符操作。

十三阿哥的博客 263

QT 拖拽 QListWidget发送,Qgraphicview接收

主要重写dragEnterEvent、dragMoveEvent、dropEvent。测试发现:item在视图存放的位置一直有问题。也没有解决item图形项位置的问题。尝试使用视图类来处理拖拽,参考。

baidu_16370559的博客 1355

QT拖放事件之三:自定义拖放操作-利用QDrag来拖动完成数据的传输

【代码】QT拖放事件之三:自定义拖放操作-利用QDrag来拖动完成数据的传输。

十三阿哥的博客 555

QT拖放事件之四:自定义拖放操作-利用QDrag来拖动完成数据的传输-案例demo

【代码】QT拖放事件之四:自定义拖放操作-利用QDrag来拖动完成数据的传输-案例demo。

十三阿哥的博客 525

Qt解析表格拖拽中默认的QMimeData的数据

在QTableWidget或者QTreeWidget实现拖拽功能时,有时需要自定义或者某些特定的逻辑条件才能接受拖拽的数据,这时候可能就要解析拖拽中的QMimeData的数据。默认拖拽的QMimeData的类型formats是application/x-qabstractitemmodeldatalist。可以通过QMimeData::data ( constQString&mime...

缘如风的博客 1778

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

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

weixin_42476987的博客 2142

Qt 自定义拖放操作

private: void dragEnterEvent(QDragEnterEvent *event); void dropEvent(QDropEvent *event); void mousePressEvent(QMouseEvent *event);#include "mainwindow.h" #include <QDrag> #include <QDropEve

RGBMarco的博客 1204

深入理解Qt拖放操作及其自定义类型实现

本文深入探讨了Qt框架中拖放操作的原理和实现方式。通过实例代码展示了如何在Qt应用程序中启动拖放操作,以及如何在拖动发生时处理各种事件,如拖拽进入、拖拽移动和拖拽放置等。文章还详细说明了如何自定义拖动类型,提供了处理常见MIME类型和自定义数据的方法,并通过案例展示了在QListWidget和QTableWidget中实现拖放功能。

weixin_28850145的博客 352

掌握Qt中的拖放操作

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

weixin_28721743的博客 369

Qt:自定义拖放操作

功能:实现在一个窗口中任意拖动图片; 头文件: mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OB

biu__biu_biu的博客 734

Qt实战案例之利用QDrag实现拖拽拼图功能.zip

Qt实战案例之利用QDrag实现拖拽拼图功能,可参考文章:https://blog.youkuaiyun.com/didi_ya/article/details/125959399

QT 自定义拖放操作,拖拽时 显示图片,且给原图片加阴影

1、要点: 1、鼠标在移动过程中显示图片 2、拖动时鼠标指针在图片的位置不变 3、拖拽图片时,给原图片添加阴影 2、MainWindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public:.

LearnLHC的博客 1301

CASS3D实战:高效三维房屋与地形采集绘制技巧

本文详细介绍了CASS3D在三维房屋与地形采集绘制中的高效技巧,包括智能绘房功能、不规则结构处理、特殊构件快速绘制及地形数据采集策略。通过实战案例和进阶操作指南,帮助用户快速掌握CASS3D的核心功能,提升三维采集与绘制效率。

weixin_29216049的博客 867

Flotherm XT学习历程

大家好,通过半年的热仿真软件学习使用,最终发现最好用,最好上手的软件就是Flotherm XT,对新手非常友好,但由于软件近几年才发布,网上教程非常少,后面我将在这里持续分析软件使用心得,和大家一起学习。

xiaoredred的博客 6261

Qt--拖放操作

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

web15085181368的博客 2044

手写数字数据集MNIST

文章目录一、 简介二、下载MNIST数据集训练集和测试集的长度输出图像数据和标记数据的形状显示手写数字图片输出数据集中的第1个样本显示图片 一、 简介 MNIST是一个非常有名的手写体数字识别数据集(手写数字灰度图像数据集),在很多资料中,这个数据集都会被用作深度学习的入门样例。 MNIST数据集是由0到9的数字图像构成的。训练图像有6万张,测试图像有1万张。MNIST数据集是NIST数据集的一个子集,它包含了60000张图片作为训练数据,10000张图片作为测试数据。由250个不同的人手写而成。 每一张图

qq_37289115的博客 1万+

Qt学习:文本图片自定义拖放操作及界面打印输出PDF文件

本文主要讲述了Qt中的拖放操作以及打印输出PDF文件功能的实现。

XCJandLL的博客 1802

Kriging代理模型理论相关推导

代理模型,Kriging,加点准则

森屹的博客 1万+

ESP32-CAM 赋能 AI 视觉巡检小车:自主避障与目标追踪实现全解析

本文基于 ESP32-CAM 实现了低成本 AI 视觉巡检小车的核心功能,硬件成本<100 元,兼顾自主避障与目标追踪。算法升级:移植 YOLOv5nano 量化模型(INT8),提升目标检测精度(如识别巡检场景中的 “异常物体”“人员”);无线拓展:通过 MQTT 协议将巡检图像、距离数据上传到阿里云 / 腾讯云,实现远程监控;多传感器融合:增加温湿度(DHT11)、红外测温(MLX90614)模块,扩展巡检维度;路径规划:结合 SLAM 算法,实现自主建图与路径巡检。

weixin_42300449的博客 368

Qt学习------自定义拖放操作

原理: 自定义MIME类型 重写相应的事件函数 示例:效果:在窗口上有一个图片,可以任意拖动它。代码: 新建QWigets应用,基类选择QMainWindow 在mainwindow.h中添加如下内容: protected: void mousePressEvent(QMouseEvent * event); // 鼠标按下事件 void dragEnterEvent(QDr

愿有人陪你颠沛流离! 1215

【转录调控网络】代谢组学与其他组学的联合分析经典模式简介

多组学联合分析经典模式转录组学&代谢组学联合分析 转录组学&代谢组学联合分析 转录组是获得生物体内基因表达的重要方法,代谢组是生物体表型的基础和直接体现者。 转录组测序可以得到大量差异表达基因和调控代谢通路,但由于基因与表型之间很难之间关联,导致关键的信号通路难以确定,因此往往达不到预期的研究目的。代谢产物是生物体在内外调控下基因转录的最终结果,是生物体表型的物质基础。 在系统生物学研究时代,生物过程复杂多变,基因调控网络复杂。针对特定的生理、病理等表型进行研究,利用转录组的数据获得大量差异

小哲的博客 6194

【亲测免费】 探索Qt拖放操作的无限可能:一款实用的开源项目推荐

探索Qt拖放操作的无限可能:一款实用的开源项目推荐 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在现代图形用户界面(GUI)设计中,拖放操作已成为提升用户体验的重要手段。无论是文件管理、数据传输还是界面交互,拖放操作都能显著简化用户的操作流程。为了帮助开发者更好地掌握这一技术,我们推荐一款基于Qt的开源项目——“Qt实现拖放文件及自定义拖放操作”。 该项目通过简洁的...

gitblog_09703的博客 404

18、Excel VBA编程:自定义函数创建与代码调试全攻略

本文详细介绍了Excel VBA中自定义函数的创建方法,以获取单元格注释为例演示了完整开发流程,并深入讲解了代码调试的重要性与核心工具。内容涵盖三种主要错误类型及其应对策略,系统介绍了调试工具栏、断点、逐行执行、Locals窗口、Immediate窗口等实用功能。通过综合案例展示了如何运用调试技术解决实际问题,并总结了提前规划、逐步测试、日志记录等最佳实践,帮助读者提升VBA编程效率与代码质量。

life6的博客 100

ARM交叉编译gdbserver并远程在线调试

arm-linux平台。5、生成完整的makefile,新建full_install,执行 ./configure --target=arm-linux-gnueabihf --host=arm-linux-gnueabihf --program-prefix=arm-linux-gnueabihf- CC=arm-linux-gnueabihf-gcc --prefix=/home/geyuxi/Documents/full_install。如果--host和--build不同,是交叉编译;

wangjie36的博客 3168
上一篇: Qt 之拖放操作-拖放打开文件
下一篇: qt 之拖放操作-打印文档
__网瘾少年
博客等级 码龄11年 122粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值