乐趣区

关于qt5:Qt开发技术Qt拽拖开发一拽托框架详解及Demo

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/116292217

红瘦子 (红模拟) 的博文大全:开发技术汇合(蕴含 Qt 实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬联合等等)继续更新中…(点击传送门)

Qt 开发专栏:开发技术(点击传送门)

上一篇:没有了
下一篇:敬请期待 …

前话

  Qt 中的拽拖操作具体介绍。

Demo

图片拽拖

  

控件拽拖

  

窗口拽拖

  

拽托框架(高级开发)

  
  

拖放(Drag and Drop)

  拖放提供了一种简略的可视机制,用户能够应用它在应用程序之间和外部传输信息。拖放的性能相似于剪贴板的剪切和粘贴机制。
  本文档形容了根本的拖放机制,并概述了在自定义控件中启用该机制的办法。许多 qt 的控件也反对拖放操作,例如我的项目视图和图形视图框架,以及为 qt 小部件和 qt quick 编辑控件。无关我的项目视图和图形视图的详细信息,请参见应用我的项目视图和图形视图框架的拖放。

拖放类

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

配置

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

  • QStyleHints::startDragTime():形容在开始拖动之前,用户必须在对象上按住鼠标按钮的工夫量(毫秒)。
  • QStyleHints::StartDragDistance():示意在挪动被解释为拖动之前,按住鼠标按钮时用户必须挪动鼠标的间隔。
  • QStyleHints::StartDragVelocity():示意用户挪动鼠标开始拖动的速度(以像素 / 秒为单位)。值为 0 示意没有这样的限度。

  如果在控件中提供拖放反对,这些数量将提供与根底窗口零碎兼容的正当默认值,供您应用。

在 Qt Quick 种的拖放

  文档的其余部分次要关注如何在 C ++ 中实现拖放。要在 Qt 疾速场景中应用拖放,请浏览 Qt Quick 拖放、DragEvent 和 DropArea 项的文档,以及 Qt 疾速拖放示例。

拖曳(Dragging)

  要开始拖动,请创立一个 QDrag 对象,并调用其 exec()函数。在大多数应用程序中,只有在按下鼠标按钮并挪动光标肯定间隔后,能力开始拖放操作。然而,启用小部件拖动最简略办法是从新实现小部件的 mousePressEvent(),并启动拖放操作:
  
  只管用户可能须要一些工夫来实现拖动操作,但就应用程序而言,exec()函数是一个带有多个值之一的阻塞函数。这些阐明操作是如何完结的,上面将具体介绍。
  留神,exec()函数不会阻塞主事件循环。
  对于须要辨别鼠标单击和拖动的小部件,从新实现小部件的 mousePressEvent()函数以记录拖动的开始地位是很有用的:
  

  稍后,在 mouseMoveEvent()中,咱们能够确定是否应该开始拖动,并结构一个拖动对象来解决该操作:
  

  这种非凡的办法应用 QPoint::manhattanlength()函数粗略预计鼠标单击地位和以后光标地位之间的间隔。此函数以精度换取速度,通常实用于此目标。

放下(Dropping)

  要可能接管小部件上抛弃的媒体,请为小部件调用 setAcceptDrops(true),并从新实现 dragEnterEvent() 和 dropEvent()事件处理程序函数。
例如,以下代码启用了 QWidget 子类的构造函数中的 Drop 事件,从而能够无效地实现 Drop 事件处理程序:
  dragEnterEvent()通常用于告诉 qt 小部件承受的数据类型。如果要在 DragMoveEvent()和 dropEvent()的从新实现中接管 QDragMoveEvent 或 QDropEvent,则必须从新实现此函数。
报错
  上面的代码显示如何从新实现 DragEnterEvent(),以通知拖放零碎咱们只能解决纯文本:
  

  dropEvent()用于解包抛弃的数据,并以适宜您的应用程序的形式对其进行解决。
  在以下代码中,事件中提供的文本将传递给 QTextBrowser,QComboBox 将填充用于形容数据的 mime 类型列表:
  

  在这种状况下,咱们承受倡议的操作,而不查看它是什么。在理论应用程序中,可能须要从 dropEvent()函数返回,而不承受倡议的操作,或者在操作不相干的状况下解决数据。例如,如果咱们不反对到应用程序中内部源的链接,咱们能够抉择疏忽 Qt::LinkAction 操作。

笼罩提议的口头

  也能够疏忽提议的操作,并对数据执行其余操作。为此,咱们将在调用 accept()之前应用 Qt::dropAction 中的首选操作调用事件对象的 setDropAction()。这样能够确保应用替换删除操作而不是倡议的操作。
对于更简单的应用程序,从新实现 dragMoveEvent()和 dragLeaveEvent()将使小部件的某些局部对搁置事件敏感,并使您可能更好地控制应用程序中的拖放。

简单小部件的子类化

  某些规范 Qt 小部件为拖放提供了本人的反对。在对这些小部件进行子类化时,除了 DragCenterEvent()和 DropEvent()之外,可能还须要从新实现 DragMoveEvent(),以避免基类提供默认的拖放解决,并解决您感兴趣的任何非凡状况。

拖放操作

  在最简略的状况下,拖放操作的指标将接管正在拖动的数据的正本,源将决定是否删除原始数据。这由 CopyAction 操作形容。指标还能够抉择解决其余操作,特地是 MoveActionLinkAction操作。如果源调用 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) 文件:
  

  对于这种状况,咱们能够简略地应用 setImageData()来提供各种格局的图像数据:
  

  在这种状况下,QByteArray 办法依然很有用,因为它能够更好地管制 QMimeData 对象中存储的数据量。
请留神,在项视图中应用的自定义数据类型必须申明为元对象,并且必须实现它们的流运算符。

放下动作

  在剪贴板模型中,用户能够剪切或复制源信息,而后粘贴它。同样,在拖放模型中,用户能够拖动信息的正本,也能够将信息自身拖动到新地位(移动信息)。拖放模型对于程序员来说还有一个额定的简单之处:在操作实现之前,程序不晓得用户是否想要剪切或复制信息。在应用程序之间拖动信息时,这通常没有什么区别,但在应用程序中,查看应用了哪个搁置操作是很重要的。
  能够为一个小部件从新实现 mouseMoveEvent(),并通过可能的拖放操作组合启动拖放操作。例如,可能心愿确保拖动始终挪动小部件中的对象:
  

  如果信息被放到另一个应用程序中,exec()函数返回的操作可能默认为 copyAction,然而如果信息被放到同一个应用程序中的另一个小部件中,咱们可能会取得不同的 drop 操作。
能够在小部件的 dragMoveEvent()函数中筛选倡议的搁置操作。然而,能够承受 DragEnterEvent()中所有倡议的操作,并让用户稍后决定要承受哪个操作:
  

  当小部件中产生搁置时,将调用 DropEvent()处理程序函数,咱们能够顺次解决每个可能的操作。首先,咱们在同一个小部件中解决拖放操作:
  

  在这种状况下,回绝解决挪动操作。承受的每种类型的跌落动作都会进行相应的检查和解决:
  

  留神,在下面的代码中查看了独自的搁置操作。如上所述,在笼罩倡议的操作局部,有时须要笼罩倡议的删除操作,并从可能的删除操作中抉择不同的操作。为此,须要查看事件的 possibleActions()提供的值中是否存在每个操作,应用 setDropAction()设置 Drop 操作,并调用 accept()。

矩形着落

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

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

剪切板

  应用程序还能够通过将数据放在剪贴板上进行通信。要拜访这个,您须要从 QApplication 对象获取一个 QClipboard 对象。
  QMimedata 类用于示意在剪贴板中传输的数据。要将数据放在剪贴板上,能够应用 setText()、setImage()和 setPixmap()不便函数来解决常见的数据类型。这些函数与在 QMimedata 类中找到的函数相似,只是它们还带有一个控制数据存储地位的附加参数:如果指定了剪贴板,则数据将搁置在剪贴板上;如果指定了抉择,则数据将搁置在鼠标抉择中(仅在 x11 上)。默认状况下,数据放在剪贴板上。
例如,咱们能够应用以下代码将 QLineEdit 的内容复制到剪贴板:

  具备不同 mime 类型的数据也能够放在剪贴板上。结构一个 qmimedata 对象,并应用 setData()函数依照后面局部形容的形式设置数据;而后能够应用 setmimedata()函数将该对象放到剪贴板上。
QClipboard 类能够通过其 dataChanged()信号告诉应用程序它所蕴含的数据的更改。例如,咱们能够通过将此信号连贯到小部件中的插槽来监督剪贴板:
  

  连贯到此信号的插槽能够应用可用于示意该信号的 MIME 类型之一读取剪贴板上的数据:
  
  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.csdn.net/qq21497936/article/details/116292217

退出移动版