爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      Qt开发技术:Qt拽拖开发(一)拽托框架详解及Demo

      首页 知识中心 云端实践 文章详情页

      Qt开发技术:Qt拽拖开发(一)拽托框架详解及Demo

      2024-06-24 07:23:24 阅读次数:45

      Qt,windows

      前话

        Qt中的拽拖操作详细介绍。

      Demo

      图片拽拖

        Qt开发技术:Qt拽拖开发(一)拽托框架详解及Demo

      控件拽拖

        Qt开发技术:Qt拽拖开发(一)拽托框架详解及Demo

      窗口拽拖

        Qt开发技术:Qt拽拖开发(一)拽托框架详解及Demo

      拽托框架(高级开发)

        Qt开发技术:Qt拽拖开发(一)拽托框架详解及Demo

      拖放(Drag and Drop)

        拖放提供了一种简单的可视机制,用户可以使用它在应用程序之间和内部传输信息。拖放的功能类似于剪贴板的剪切和粘贴机制。

        本文档描述了基本的拖放机制,并概述了在自定义控件中启用该机制的方法。许多qt的控件也支持拖放操作,例如项目视图和图形视图框架,以及为qt小部件和qt quick编辑控件。有关项目视图和图形视图的详细信息,请参见使用项目视图和图形视图框架的拖放。

      拖放类

        这些类处理拖放和必要的mime类型编码和解码。

        Qt开发技术:Qt拽拖开发(一)拽托框架详解及Demo

      配置

        QStyleHints对象提供了一些与拖放操作相关的属性:

      • QStyleHints::startDragTime():描述在开始拖动之前,用户必须在对象上按住鼠标按钮的时间量(毫秒)。
      • QStyleHints::StartDragDistance():表示在移动被解释为拖动之前,按住鼠标按钮时用户必须移动鼠标的距离。
      • QStyleHints::StartDragVelocity():表示用户移动鼠标开始拖动的速度(以像素/秒为单位)。值为0表示没有这样的限制。
          如果在控件中提供拖放支持,这些数量将提供与基础窗口系统兼容的合理默认值,供您使用。

      在Qt Quick种的拖放

        文档的其余部分主要关注如何在C++中实现拖放。要在Qt快速场景中使用拖放,请阅读Qt Quick拖放、DragEvent和DropArea项的文档,以及Qt快速拖放示例。

      拖曳(Dragging)

        要开始拖动,请创建一个QDrag对象,并调用其exec()函数。在大多数应用程序中,只有在按下鼠标按钮并移动光标一定距离后,才能开始拖放操作。但是,启用小部件拖动最简单方法是重新实现小部件的mousePressEvent(),并启动拖放操作:

        Qt开发技术:Qt拽拖开发(一)拽托框架详解及Demo

        稍后,在mouseMoveEvent()中,我们可以确定是否应该开始拖动,并构造一个拖动对象来处理该操作:

        Qt开发技术:Qt拽拖开发(一)拽托框架详解及Demo

        这种特殊的方法使用QPoint::manhattanlength()函数粗略估计鼠标单击位置和当前光标位置之间的距离。此函数以精度换取速度,通常适用于此目的。

      放下(Dropping)

        要能够接收小部件上丢弃的媒体,请为小部件调用setAcceptDrops(true),并重新实现dragEnterEvent()和dropEvent()事件处理程序函数。

      例如,以下代码启用了QWidget子类的构造函数中的Drop事件,从而可以有效地实现Drop事件处理程序:

        dragEnterEvent()通常用于通知qt小部件接受的数据类型。如果要在DragMoveEvent()和dropEvent()的重新实现中接收QDragMoveEvent或QDropEvent,则必须重新实现此函数。

      报错

        下面的代码显示如何重新实现DragEnterEvent(),以告诉拖放系统我们只能处理纯文本:

         Qt开发技术:Qt拽拖开发(一)拽托框架详解及Demo

        在这种情况下,我们接受建议的操作,而不检查它是什么。在实际应用程序中,可能需要从dropEvent()函数返回,而不接受建议的操作,或者在操作不相关的情况下处理数据。例如,如果我们不支持到应用程序中外部源的链接,我们可以选择忽略Qt::LinkAction操作。

      覆盖提议的行动

        也可以忽略提议的操作,并对数据执行其他操作。为此,我们将在调用accept()之前使用Qt::dropAction中的首选操作调用事件对象的setDropAction()。这样可以确保使用替换删除操作而不是建议的操作。

      对于更复杂的应用程序,重新实现dragMoveEvent()和dragLeaveEvent()将使小部件的某些部分对放置事件敏感,并使您能够更好地控制应用程序中的拖放。

      复杂小部件的子类化

        某些标准Qt小部件为拖放提供了自己的支持。在对这些小部件进行子类化时,除了DragCenterEvent()和DropEvent()之外,可能还需要重新实现DragMoveEvent(),以防止基类提供默认的拖放处理,并处理您感兴趣的任何特殊情况。

      拖放操作

        在最简单的情况下,拖放操作的目标将接收正在拖动的数据的副本,源将决定是否删除原始数据。这由CopyAction操作描述。目标还可以选择处理其他操作,特别是MoveAction和LinkAction操作。如果源调用QDrag::exec(),并返回MoveAction,则如果源选择删除任何原始数据,则该源将负责删除。不应删除源小部件创建的QMimeData和QDrag对象-它们将被Qt销毁。 目标负责获取在拖放操作中发送的数据的所有权;这通常通过保留对数据的引用来实现。

        如果目标理解LinkAction操作,它应该存储自己对原始信息的引用;源不需要对数据执行任何进一步的处理。拖放操作的最常见用法是在同一个小部件中执行移动;有关此功能的详细信息,请参阅有关拖放操作的部分。

        拖动操作的另一个主要用途是在使用引用类型(如text/uri-list)时,其中拖动的数据实际上是对文件或对象的引用。

      添加新的拖放类型

        拖放不限于文本和图像。任何类型的信息都可以在拖放操作中传输。要在应用程序之间拖动信息, 应用程序必须能够相互指示可以接受哪些数据格式以及可以生成哪些数据格式,这是通过使用mime类型实现的。 由源构造的QDrag对象包含一个用于表示数据的mime类型列表(从最合适的到最不合适的顺序排列),drop目标使用其中一个来访问数据。对于常见的数据类型,便利函数处理透明使用的mime类型,但是对于自定义数据类型,必须显式地声明它们。

        要对QDrag便利功能未涵盖的信息类型执行拖放操作,第一步也是最重要的一步是查找适当的现有格式:Internet分配号码管理局(IANA)在信息科学研究所(ISI)提供了MIME媒体类型的分层列表。使用标准的mime类型可以最大限度地提高应用程序与其他软件现在和将来的互操作性。

      要支持其他媒体类型,只需使用setData()函数设置QMimeData对象中的数据,提供完整的mime类型和以适当格式包含数据的QByteArray。以下代码从标签中获取QPixmap,并将其存储为QMimeData对象中的可移植网络图形(PNG)文件:

        Qt开发技术:Qt拽拖开发(一)拽托框架详解及Demo

        在这种情况下,QByteArray方法仍然很有用,因为它可以更好地控制QMimeData对象中存储的数据量。

      请注意,在项视图中使用的自定义数据类型必须声明为元对象,并且必须实现它们的流运算符。

      放下动作

        在剪贴板模型中,用户可以剪切或复制源信息,然后粘贴它。同样,在拖放模型中,用户可以拖动信息的副本,也可以将信息本身拖动到新位置(移动信息)。拖放模型对于程序员来说还有一个额外的复杂之处:在操作完成之前,程序不知道用户是否想要剪切或复制信息。在应用程序之间拖动信息时,这通常没有什么区别,但在应用程序中,检查使用了哪个放置操作是很重要的。

        可以为一个小部件重新实现mouseMoveEvent(),并通过可能的拖放操作组合启动拖放操作。例如,可能希望确保拖动始终移动小部件中的对象:

        Qt开发技术:Qt拽拖开发(一)拽托框架详解及Demo

        当小部件中发生放置时,将调用DropEvent()处理程序函数,我们可以依次处理每个可能的操作。首先,我们在同一个小部件中处理拖放操作:

        Qt开发技术:Qt拽拖开发(一)拽托框架详解及Demo

        注意,在上面的代码中检查了单独的放置操作。如上所述,在覆盖建议的操作部分,有时需要覆盖建议的删除操作,并从可能的删除操作中选择不同的操作。为此,需要检查事件的possibleActions()提供的值中是否存在每个操作,使用setDropAction()设置Drop操作,并调用accept()。

      矩形下落

        小部件的dragMoveEvent()可用于通过仅在光标位于这些区域内时接受建议的放置操作来限制小部件的某些部分的放置。例如,当光标位于子小部件(DropFrame)上时,以下代码接受任何建议的放置操作:

        Qt开发技术:Qt拽拖开发(一)拽托框架详解及Demo

        如果您需要在拖放操作期间提供视觉反馈、滚动窗口或任何适当的操作,也可以使用DragMoveEvent()。

      剪切板

        应用程序还可以通过将数据放在剪贴板上进行通信。要访问这个,您需要从QApplication对象获取一个QClipboard对象。

        QMimedata类用于表示在剪贴板中传输的数据。要将数据放在剪贴板上,可以使用setText()、setImage()和setPixmap()方便函数来处理常见的数据类型。这些函数与在QMimedata类中找到的函数类似,只是它们还带有一个控制数据存储位置的附加参数:如果指定了剪贴板,则数据将放置在剪贴板上;如果指定了选择,则数据将放置在鼠标选择中(仅在x11上)。默认情况下,数据放在剪贴板上。

      例如,我们可以使用以下代码将QLineEdit的内容复制到剪贴板:

        具有不同mime类型的数据也可以放在剪贴板上。构造一个qmimedata对象,并使用setData()函数按照前面部分描述的方式设置数据;然后可以使用setmimedata()函数将该对象放到剪贴板上。

      QClipboard类可以通过其dataChanged()信号通知应用程序它所包含的数据的更改。例如,我们可以通过将此信号连接到小部件中的插槽来监视剪贴板:

        Qt开发技术:Qt拽拖开发(一)拽托框架详解及Demo

        selectionChanged()信号可用于x11以监视鼠标选择。

      与其他应用程序互操作

        在x11上,使用公共XDND协议,而在Windows Qt上使用OLE标准,而Qt for MacOS使用Cocoa拖动管理器。在x11, XDND使用MIME,因此不需要翻译。无论平台如何,QT API都是相同的。在Windows上,支持MIME的应用程序可以使用MIME类型的剪贴板格式名称进行通信。一些Windows应用程序已经为其剪贴板格式使用了MIME命名约定。

        用于转换专用剪贴板格式的自定义类可以通过在Windows上重新实现QwinMime或在MacOS上重新实现QMacPasteboardMime来注册。

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/hongpangzi/4974017,作者:长沙红胖子Qt,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:【网络编程】简单的服务端客户端实现

      下一篇:Java:一个API文档框架Swagger

      相关文章

      2025-05-07 09:08:23

      Qt中串口模块的使用

      在Qt的拓展模块中,Qt提供了许多的结果通讯模块,有串口、can、 ModBus等。

      2025-05-07 09:08:23
      Qt , 模块 , 设置
      2025-04-23 08:18:32

      Qt中文件夹的操作

      Qt中对于文件夹的操作类主要是QDir类,这个类中提供了文件夹的创建、删除、判断文件夹是否存在、文件夹中的文件数目等功能。

      2025-04-23 08:18:32
      Qt , 使用 , 文件夹 , 路径
      2025-03-24 08:45:46

      windows中CMD快捷命令

      windows中CMD快捷命令

      2025-03-24 08:45:46
      windows , 打开 , 管理器
      2025-03-06 09:14:22

      小白高薪捷径-Qt开发

      小白高薪捷径-Qt开发

      2025-03-06 09:14:22
      C++ , Qt , 开发 , 添加
      2025-02-28 09:28:01

      Pytorch 学习(9):Python C 扩展( C、C++代码-----C so 代码库------python代码调用)

      Pytorch 学习(9):Python C 扩展( C、C++代码-----C so 代码库------python代码调用)

      2025-02-28 09:28:01
      bin , windows , 代码 , 版本
      2025-01-14 09:17:05

      Java竖线分割字符串问题

      Java竖线分割字符串问题

      2025-01-14 09:17:05
      https , Java , windows , 使用 , 分割 , 字符串 , 转义字符
      2025-01-08 08:39:44

      windows系统环境c++(c) socket编程实例代码(含服务端和客户端)

      本代码是windows系统环境c++(c) socket编程实例。包含客户端和服务端,可以实现客户端发送消息,服务端接收消息并写入日志。 server.cpp为服务端。

      2025-01-08 08:39:44
      client , cpp , server , socket , windows , 代码 , 客户端 , 服务端
      2024-12-31 06:01:41

      在windows server 2016中通过dbca创建数据库时,出现DIM-00019告警

      在windows server 2016中通过dbca创建数据库时,出现DIM-00019告警

      2024-12-31 06:01:41
      dbca , server , windows
      2024-11-27 03:26:40

      windows cmake编译报错 “No CUDA toolset found.“

      windows cmake编译报错 “No CUDA toolset found.“

      2024-11-27 03:26:40
      windows , 编译
      2024-10-24 08:33:12

      Windows平台里的grep——1.Borland grep

      grep来自英文词组“global search regular expression and print out the line”的缩写,意思是用于全面搜索的正则表达式,并输出相应行。Unix和Linux都直接提供了grep命令。

      2024-10-24 08:33:12
      c++ , windows
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5228997

      查看更多

      最新文章

      windows系统环境c++(c) socket编程实例代码(含服务端和客户端)

      2025-01-08 08:39:44

      Linux系统配置 Samba客户端

      2024-04-18 09:15:34

      Windows PC、Linux、Android、iOS 跨平台视频云客户端 QML 开发解决方案

      2023-06-14 09:11:57

      安装Windows Outlook邮箱客户端

      2023-05-31 08:48:25

      Qt Charts_Audio实践

      2023-05-29 10:48:43

      Qt Charts实践

      2023-05-29 10:48:43

      查看更多

      热门文章

      Windows PC、Linux、Android、iOS 跨平台视频云客户端 QML 开发解决方案

      2023-06-14 09:11:57

      Qt Charts_Audio实践

      2023-05-29 10:48:43

      Qt Charts实践

      2023-05-29 10:48:43

      安装Windows Outlook邮箱客户端

      2023-05-31 08:48:25

      Linux系统配置 Samba客户端

      2024-04-18 09:15:34

      windows系统环境c++(c) socket编程实例代码(含服务端和客户端)

      2025-01-08 08:39:44

      查看更多

      热门标签

      客户端 实践 基础知识 Java 服务器 java 数据库 框架 python 服务端 学习 代码 简单 javascript 编程
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      windows系统环境c++(c) socket编程实例代码(含服务端和客户端)

      Windows PC、Linux、Android、iOS 跨平台视频云客户端 QML 开发解决方案

      Qt Charts实践

      Linux系统配置 Samba客户端

      安装Windows Outlook邮箱客户端

      Qt Charts_Audio实践

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号