Qt drag & drop

Qt Drag&Drop拖动与放置 本文章从属于系列拖放操作包括两个动作:拖动(drag)和放下(drop或称为放置)。 阅读详情

Qt drag & drop

Example: draggable Icons

用户将一个widget中的东西,这个例子中是QLable控件拖动至另一个widget,这个例子甚至支持程序2个实例之间的拖拽操作。Widget之间和程序实例之间拖拽操作结果是复制一个lable并将其放到鼠标release的位置上。

传输的信息不仅包含QLable本身包含的图片信息,还有鼠标点击位置信息,这样用户就能精确放置Icon位置了。不过这需要MIME类型格式。

 

MIME格式:多用途互联网邮件扩展(MIME,Multipurpose Internet Mail Extensions)是一个互联网标准,它扩展了电子邮件标准,使其能够支持非ASCII字符、二进制格式附件等多种格式的邮件消息。MIME是通过标准化电子邮件报文的头部的附加域(fields)而实现的;这些头部的附加域,描述新的报文类型的内容和组织形式。

 

用于放置icon的widget:

class DragWidget : public QFrame
 {
 public:
    DragWidget(QWidget *parent=0);
 
 protected:
    void dragEnterEvent(QDragEnterEvent *event);
    void dragMoveEvent(QDragMoveEvent *event);
    void dropEvent(QDropEvent *event);
     voidmousePressEvent(QMouseEvent *event);
 };

构造函数:

DragWidget::DragWidget(QWidget *parent)
    : QFrame(parent)
 {
    setMinimumSize(200, 200);
    setFrameStyle(QFrame::Sunken | QFrame::StyledPanel);
    setAcceptDrops(true);
 
    QLabel *boatIcon = new QLabel(this);
    boatIcon->setPixmap(QPixmap(":/images/boat.png"));
    boatIcon->move(20, 20);
    boatIcon->show();
    boatIcon->setAttribute(Qt::WA_DeleteOnClose);
 
    QLabel *carIcon = new QLabel(this);
    carIcon->setPixmap(QPixmap(":/images/car.png"));
    carIcon->move(120, 20);
    carIcon->show();
    carIcon->setAttribute(Qt::WA_DeleteOnClose);
 
    QLabel *houseIcon = new QLabel(this);
    houseIcon->setPixmap(QPixmap(":/images/house.png"));
    houseIcon->move(20, 120);
    houseIcon->show();
    houseIcon->setAttribute(Qt::WA_DeleteOnClose);
 }

houseIcon->setAttribute(Qt::WA_DeleteOnClose);
//这句话表示Qt将在QLable控件接受closeEvent的时候删除之。
//[疑问]那不写这句话会怎么样呢?

从起始位置实现拖操作,必须有一个鼠标点击事件函数:

voidDragWidget::mousePressEvent(QMouseEvent *event)
 {
    QLabel *child = static_cast<QLabel*>(childAt(event->pos()));
    if (!child)
        return;
 
     QPixmap pixmap = *child->pixmap();
 
    QByteArray itemData;
    QDataStream dataStream(&itemData, QIODevice::WriteOnly);
    dataStream << pixmap << QPoint(event->pos() -child->pos());

这里用了QByteArray打包了pixmap和鼠标移动造成的偏移向量信息。用dataStream写入到QByteArray非常方便。

 

使用QMimeData保存这些信息,据说是为了interoperability(两台不同电脑共同工作交通的能力):

    QMimeData *mimeData = new QMimeData;
    mimeData->setData("application/x-dnditemdata", itemData);

QMineData有个setData(),可以直接将一个QByteArray参数传入。第一个参数一个字符串用于指定这个MIME的format,方便其他widget或者程序识别拖拽信息。

 

拖拽操作本身由一个QDrag完成:

    QDrag *drag = new QDrag(this);
    drag->setMimeData(mimeData);//将数据传给drag
    drag->setPixmap(pixmap);//拖拽过程中显示的图片
    drag->setHotSpot(event->pos() - child->pos());
    //Hot Spot是一个精确定位鼠标位置的东东,event->pos()指示鼠标点击的位置。
    //Setsthe position of the hot spot relative to the top-left corner of the pixmap usedto the point specified by hotspot.

voidDragWidget::dragEnterEvent(QDragEnterEvent *event)
 {
    if(event->mimeData()->hasFormat("application/x-dnditemdata")) {
        if (event->source() == this) {
            event->setDropAction(Qt::MoveAction);
            event->accept();
        } else {
            event->acceptProposedAction();
        }
    } else {
        event->ignore();
    }
 }

其中的acceptProposedAction()。一个drop event包含了一个proposed action,这个action到底是什么可以从proposedAction()获得,无论这个widget是否接受这个event。如果widget能够处理这个event,那么应该调用一下acceptProposedAction()函数。因为proposed action是一个Qt::DropAction枚举的混合,选用这些枚举中的其中一个作为默认的action或者让用于选择(用户可以在放下物件的时候选择操作,复制,移动什么的)非常有用。

Constant Value Description
Qt::CopyAction 0x1 Copy the data to the target.
Qt::MoveAction 0x2 Move the data from the source to the target.
Qt::LinkAction 0x4 Create a link from the source to the target.
Qt::ActionMask 0xff  
Qt::IgnoreAction 0x0 Ignore the action (do nothing with the data).
Qt::TargetMoveAction 0x8002 On Windows, this value is used when the ownership of the D&D data should be taken over by the target application, i.e., the source application should not delete the data. 
On X11 this value is used to do a move. 
TargetMoveAction is not used on the Mac.

voidDragWidget::dragMoveEvent(QDragMoveEvent *event)
 {
    if(event->mimeData()->hasFormat("application/x-dnditemdata")) {
        if (event->source() == this) {
            event->setDropAction(Qt::MoveAction);
            event->accept();
        } else {
            event->acceptProposedAction();
         }
    } else {
        event->ignore();
    }
 }

 

void DragWidget::dropEvent(QDropEvent *event)//一个对信息的解锁过程
{
    if(event->mimeData()->hasFormat("application/x-dnditemdata")) {
       QByteArray itemData = event->mimeData()->data("application/x-dnditemdata");
       QDataStream dataStream(&itemData, QIODevice::ReadOnly);
       
       QPixmap pixmap;
       QPoint offset;
       dataStream >> pixmap >> offset;
 
       QLabel *newIcon = new QLabel(this);
       newIcon->setPixmap(pixmap);
       newIcon->move(event->pos() - offset);
       newIcon->show();
       newIcon->setAttribute(Qt::WA_DeleteOnClose);
 
       if (event->source() == this) {
           event->setDropAction(Qt::MoveAction);
           event->accept();
       } else {
           event->acceptProposedAction();
       }
    }else {
       event->ignore();
    }
}

QT:Widget拖拽操作 在 Qt 中,拖拽操作(Drag and Drop)提供了一种直观的用户交互方式,用于在应用程序内部或者不同应用程序之间移动或复制数据。它涉及两个主要的动作:拖动(Drag)和放置(Drop)。拖动是指用户在一个部件(Widget)上按下鼠标,移动鼠标来 “抓起” 数据的过程;放置是指用户将 “抓起” 的数据移动到另一个部件上并松开鼠标,将数据 “放下” 的过程。 阅读详情

相关推荐

Qt拖放 drag and drop

拖放提供一个应用程序之间传递信息的一种简单的可视化机制。拖放机制类似于剪切和粘贴机制。拖放操作同时被QT项目视图和图形视图框架支持。 QApplication提供了两个拖放相关的方法: 1. QApplication::startDragTime。它描述了用户按下鼠标多长时间开始拖放操作。 2. QApplication::startDragDistance。它描述了用户

—— 然 之 1万+

Qt之Qt::WA_DeleteOnClose详解

当用户关闭一个主窗口时,默认行为是隐藏它,所以它还会保留在内存中。对于数量大的主窗口会造成一定的问题。解决办法是在构造函数中对Qt::WA_DeleteOnClose的属性进行设置:     MainMindow::MainWindow( ) {         . . .         setAttribute(Qt::WA_DeleteOnClose);         . . .

Bruce_0712的博客 1万+

Qt之QToolButton 实现动态拖拽Drag、Drop功能

Qt之QToolButton与QGroupBox实现动态拖拽Drag、Drop功能,可以随意拖放到QGroupBox内,也可以与现有的QToolButton交换位置,也可以拖拽出QGroupBox外释放

用 QT实现拖放(drag-drop)功能

QT的 qdrag 和 qdrop功能在qt的"Puzzle"示例中有介绍。但是那个介绍是以QListWidget为基础的。本文以QWidget为基础,介绍如何实现拖放。拖放可以用QString作为信息载体,也可以使用html等类型。本文采用QByteArray。QByteArray允许程序员使用自定义的类型来作为信息载体。本文定义的类型是ST_INFO。 头文件: #ifndef MAINW

liji_digital的博客 1万+

电竞护航系统成品搭建俱乐部点单小程序开发三角洲小程序搭建

电竞护航系统成品搭建俱乐部点单小程序开发三角洲小程序搭建

dapengglove的博客 1682

PCIe Gen4 Switch芯片PM40028调试踩坑实录:从boot引脚设置到串口无输出的诡异问题

本文记录了PCIe Gen4 Switch芯片PM40028的实战调试过程,重点剖析了从boot引脚配置错误导致串口无输出,到使用逻辑分析仪定位并解决启动问题的完整排障思路。文章深入探讨了芯片启动流程、硬件信号测量方法,并总结了高速硬件调试的核心经验与系统性排查清单,为工程师解决类似PCIe Gen4设备调试难题提供实用指南。

i8j9k0l1的博客 251

【Qt学习笔记】13.拖放技术:Drag & Drop

1、接受拖放Drag &amp; Drop 是一个界面操作,用于在两个窗口间传递数据。Drag Source: 拖放源窗口Drag Target: 拖放目标窗口拖放操作:1、在源窗口:选中目标,按下鼠标,移动,拖至目标窗口(Drag)2、在目标窗口:取消鼠标,到指定位置,松开鼠标(Drop)(按下ESC取消操作)MIME:MIME(Multipurpose Internet ...

weixin_33724659的博客 279

从零到一:YOLOv8在边缘设备上的轻量化部署实战

本文详细介绍了YOLOv8在边缘设备上的轻量化部署实战,涵盖模型优化、TensorRT加速、剪枝与知识蒸馏等关键技术。通过工业质检和智能门禁项目案例,展示了如何将YOLOv8高效部署到树莓派、Jetson Nano等资源受限设备,显著提升推理速度和降低内存占用。文章还提供了动态分辨率调整、多模型级联部署等实用技巧,助力开发者实现边缘AI应用的高效落地。

weixin_29040367的博客 379

Qt GUI 模块

在core模块之上,就是最为重要的GUI模块了。Qt4中只有QtGui模块,UI相关的功能都封装在一起。Qt5中拆分为GUI、Widget两个模块。GUI模块提供桌面系统集成,事件处理,OpenGL/Vulkan,基础图像,字体等功能。通过链接1 可知,GUI模块的class 是相当少的。但是,它们却是Qt 界面技术的核心。我们甚至可以不使用Qt Widget 模块,也能做出来符合设计的UI功...

know yourself 2787

MacOS蓝牙连接疑难杂症:从基础排查到高级修复全攻略

本文提供了一份全面的MacOS蓝牙故障排查与修复指南。从基础的菜单栏检查、终端命令诊断,到软/硬重启蓝牙服务、删除配置文件,再到使用blueutil工具、重置NVRAM等高级方法,系统性地解决了蓝牙无法连接、连接不稳定等常见问题。最后还分享了环境干扰排查、预防措施及硬件故障自检方法,帮助用户彻底解决Mac蓝牙连接难题。

weixin_29271263的博客 450

Simulink封装与库的建立

第二栏设置标签,第三栏是对应变量名,即是第一张图中的常量名。1.先将输入与常量模块相连接并生成子系统。按照如图所示添加修改,最后的效果如下图。封装子系统搭建测试环境。

lensyu1994的博客 1741

PyQt5基本控件详解之Drag(二十)

Drag与Drop 前言 为用户提供的拖曳功能很直观,在很对桌面应用程序中,复制或移动对象都可以通过拖曳来完成 基于MIME类型的拖曳数据传输是基于QDrag类的,QMimeData对象将关联的数据与其对应的MIME类型相关联 MIME意为多功能Internet邮件扩展,它设计的最初目的是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。然而当它被HTTP协...

jia666666的博客 3521

TurboQuant: Online Vector Quantization with Near-optimal Distortion Rate

这篇被 ICLR 2026 接收的论文提出了一种名为TurboQuant的全新在线向量量化(Vector Quantization, VQ)算法。该研究的核心目标是解决大语言模型(LLM)在长上下文推理时面临的 KV Cache 显存消耗瓶颈,以及大规模向量数据库在近似最近邻检索中的存储与延迟问题。有别于现有技术,TurboQuant 是一种无需任何校准数据、无需训练的在线算法(Data-oblivious)。

c_cpp_csharp的专栏 118

PyQt5——拖曳与剪切板

拖曳与剪切板 Drag与Drop 在很多桌面应用程序中,复制或移动对象都可以通过拖曳来完成。 基于MIME类型的拖曳数据传输是基于QDrag类的。QMimeData对象将关联的数据与其对应的MIME类型相关联。 常见的MIME类型(通用型)如下: HTML文本 .html text/html XML文档 .xml texe/xml XHTML文档 .xhtml application/xhtml...

绝尘 585

华为OD新系统机试真题 - 配置操作失败数量统计

华为OD机试新系统 4月8号【配置操作失败数量统计】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【配置操作失败数量统计】。

qq_45776114的博客 1160

Python + Playwright:集成 Applitools 进行视觉回归测试(快速入门)

Applitools是一款基于人工智能的视觉验证测试工具,专门用于自动化和验证应用程序的用户界面(UI);Applitools使用视觉回归测试来检测应用程序界面的变化,确保 UI 在不同版本之间的一致性;Applitools的核心功能是通过视觉比较,检测 UI 元素的差异,而无需手动编写复杂的界面检查代码;通过集成Applitools,测试人员可以轻松捕捉和验证界面中的视觉差异,无论是在Web移动端或桌面应用的测试环境;

blues_C的博客 2921

Qt鼠标事件实战:5个常见交互场景的代码实现与避坑指南

本文通过5个常见交互场景的代码实现,深入解析Qt鼠标事件的核心应用与避坑技巧。涵盖平滑绘图板、视图拖拽缩放、自定义按钮、复杂事件分发及跨窗口拖拽,重点剖析了重写机制、坐标转换、性能优化等关键点,帮助开发者构建稳定高效的GUI应用。

mqtt6iot的博客 433

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

深入解析QGraphicsView:从基础到高级交互应用

本文深入解析Qt图形视图框架的核心组件QGraphicsView,从Scene、Item、View三要素的协作关系,到视图变换、交互事件处理和性能优化等高级应用。通过实战案例,帮助开发者掌握如何利用QGraphicsView构建流程图、CAD等复杂的2D交互界面,提升开发效率。

peace的博客 865

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

详解QT下拖动操作Drag-Drop的实现

QT下实现Drag-Drop是极其容易的,下面给大家介绍一下。 所谓拖动,自动有一个源窗口,一个目标窗口,不过有时候源窗口与目的窗口是同一个窗口。 源窗口 在鼠标Press的时候,记录起始点为dragPosition(此为成员变量);在Move的时候,检测与起始点的距离,当拖动一定距离的时候,认为开启了一个拖动操作。按下面例子,鼠标会为成拖动的样式,并有一个图片显示被拖动的物体的轮廓。 ...

阿发你好 2万+

Qt drag和drop演示

首先,来看效果图: drag演示 drop演示     1、drag效果实现 我这里是对QListWidget的扩充,当然你可以使用其他Widget,实现方法类似,都要重新实现一下mousePressEvent和mouseMoveEvent两个函数,beginPos的作用在后面会提到。 class DragListWidget : public QListWidg

junzhepan的专栏 1716

Qt Drag and Drop 实现拖拽控件效果

#在头文件中声明事件操作函数,MainWindow.h中如下: #ifndef MAINWINDOW_H #define MAINWINDOW_H #include &lt;QMainWindow&gt; QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : publ...

ASCE_Python的博客 4881

[转]详解QT下拖动操作Drag-Drop的实现

QT下实现Drag-Drop是极其容易的,下面给大家介绍一下。 所谓拖动,自动有一个源窗口,一个目标窗口,不过有时候源窗口与目的窗口是同一个窗口。 源窗口 在鼠标Press的时候,记录起始点为dragPosition(此为成员变量);在Move的时候,检测与起始点的距离,当拖动一定距离的时候,认为开启了一个拖动操作。按下面例子,鼠标会为成拖动的样式,并有一个图片显示被拖动的物体的轮廓。 void HostTree::mouseMoveEvent ( QMouseEvent * event ){ i

皮牙子快跑的博客 1477

qt dnd drag and drop 拖放

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

证券指标的专栏 821

QT之拖拽Drag-Drop

QT之拖拽Drag-Drop QT之拖拽Drag-Drop 效果图 代码 结尾效果图代码//鼠标点击图片时 void DragWidget::mousePressEvent(QMouseEvent *event) { QLabel *child = static_cast<QLabel*>(childAt(event->pos())); if (!child) ret

项目开发/项目维护/项目指导 2029

Qt官方案例知识点总结(拖放操作——Drag And Drop Robot )

QApplication::startDragDistance() ,超过这个距离才启用拖动。),会跟着拖动对象一起释放。重写QGraphicsItem的鼠标移动事件,在移动事件中开启拖动。(QDrag * drag)可以指定父对象也可以不指定,他。即不重写相关虚函数,直接将数据作为其子类的成员变量,如下。可以看到以图像内轮廓为边界线,无关的白色区域被抹去了。创建自定义数据 ,指定类型的字符串可以自己随便写。可以在动画组里添加多个动画,这些通话可以同时进行。,来和回是完全相反的两个动画,如下。

sc_o_r_pio的博客 862
上一篇: 一篇可视化论文笔记
下一篇: 各种流行的编程风格【转自酷壳】
doctorsc
博客等级 码龄19年 51粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值