若该文为原创文章,转载请注明原文出处
本文章博客地址: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