PyQt: 拖放事件(Drag & Drop)

拖放,通过拖拽一个或者多个对象来完成相应的移动、复制等操作。拖放在我们使用的程序应用中是一个非常常见的操作,也是一个非常实用的操作。

MIME

Pyqt的拖放事件是基于MIME的拖放。QMimeData对象存储着相关的数据并对应着某种MIME类型,该对象存储在剪贴板上以便应用于拖放过程。

QMimeData类的函数支持一些MIME类型的检测。

Tester Getter Setter MIME Types
hasText() text() setText() text/plain
hasHtml() html() setHtml() text/html
hasUrls() urls() setUrls() text/uri-list
hasImage() imageData() setImageData() image/ *
hasColor() colorData() setColorData() application/x-color

拖放事件并不仅仅局限于处理文本和图像数据,任何类型的数据都可以在拖放操作中进行传递。为了可以在不同的应用中“拖”信息,这些应用必须标明他们可以接受或者产生哪些类型的数据。而MIME 类型就可以满足这一要求。QDrag对象在构建的时候就包含了一个MIME类型的列表来表征数据,且被接受的部件对象会利用这个来获取数据。对于通用的数据类型,可以非常方便地使用上述函数来进行处理,而对于用户自定义数据类型,则很有必要进行显式的声明。

为了支持额外的媒体类型(media type), 可以简单的通过QMimeData对象的setData()函数来进行数据的设置。该函数可以适用于所有的MIME类型和包含合适数据类型的QByteArray对象。

拖放行为

pyqt中的很多widget都支持拖放事件,而拖放事件也有好几个重要的类。

QDrag:支持基于MIME的拖放数据转移器。
DragEnterEvent: 当被拖动的对象移动到可以可以接受操作的widget时会触发该方法。
DragMoveEvent:当拖放操作在执行过程中触发。
DragLeaveEvent:当拖放操作离开当前widget时触发。
DropEvent:当拖放操作结束时触发。

Note: 以上的触发前置条件是当前区域(widget)可以接受拖放,这个可以通过setAccepteDrops(True)函数来激活。

在最简单的例子中,拖放行为的目标(target)会接收一份被“拖”对象的copy,并且数据的“源”会考虑是不是删除原始数据,而这一个结果将由CopyAction行为决定。当然,target也会处理其他类型的行为,如MoveActionLinkAction等行为。如果“源”(source)调用QDrag对象的exec()并且返回一个MoveAction,那么“源”就需要自己选择是否删除原始数据。被源部件创建的QMimeDataQDrag对象最好不被删除。目标部件通常会保存原始数据的引用。

实例

Dragging

开始“拖”操作,需要创建一个QDrag对象,并调用exec()函数。在大多数应用中,最好的实现方式就是通过鼠标来进行。当鼠标被按下且光标移动到目的区域时释放就完成了拖放操作。因此,最简单实现拖放操作就是重写widget的mousePressEvent()

def mousePresseEvent(self, event)if event.button() == Qt.LeftButtondrag = QDrag()mimedata = QMimeDatamimedata.setText('aaa')#放入数据drag.setMimeData(mimedata)drag.exec_() #exec()函数并不会阻塞主函数

上述是最简单的’拖’操作定义方式。当然,为了避免功能冲突,也可以在mouseMoveEvent()中进行该操作的定义。

Droping

为了使得相关的widget能够响应释放操作,需要使用setAcceptDrops(True)并且重写相关的dragEnterEvent()dropEvent()函数。在重写dragMoveEvent()dropEvent()函数之前,必须先重写dropEnter()函数。而dropEnter()通常用来判断 当前widget是否接受操作带有的数据类型。而dropEvent()通常是用来处理被释放的数据。

def dragEnterEvent(self, event)event.acceptProposedAction()def dropEvent(self, event)#To Do

Reference

[1] PyQt - Drag & Drop
[2] Qt Documentation: Drag and Drop
[3] Qt Documentation: QMimeData Class
[4] PyQt4 - Drag and Drop

PyQt: 拖放事件(Drag Drop)相关推荐

  1. java drag drop_原生拖拽,拖放事件(drag and drop)

    原生拖拽,拖放事件(drag and drop) 拖拽,拖放事件可以通过拖拽实现数据传递,达到良好的交互效果,如:从操作系统拖拽文件实现文件选择,拖拽实现元素布局的修改. drag and drop事 ...

  2. ASP.NET AJAX (Atlas) 拖放(Drag Drop)功能6种实现方法总结

    在Ajax程序中实现传统桌面程序中异常简单的拖放功能却并不是件容易的事情.然而Web上的拖放功能又如此的让人痴迷,所以几乎每个成熟的Ajax类库都提供了自己的一套实现拖放的封装,ASP.NET AJA ...

  3. 使用ASP.NET Atlas实现拖放(Drag Drop)效果(下)

    English Version: http://dflying.dflying.net/1/archive/77_atlas_drag__drop_overview.html 中文版:http://d ...

  4. HTML5原生拖拽/拖放 Drag Drop 详解

    转载自:juejin.im/post/5a169d- 前言 拖放(drap && drop)在我们平时的工作中,经常遇到.它表示:抓取对象以后拖放到另一个位置.目前,它是HTML5标准 ...

  5. HTML5 drag drop 拖拽与拖放简介

    by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpress/?p=1419 一.前面的话 ...

  6. HTML5拖放(drag and drop)与plupload的懒人上传

    HTML5拖放能够将本地的文件拖放到页面上,plupload又是很好的文件上传插件,而今天就将两者结合,做了个文件拖拽上传的功能. 简述HTML5拖放 拖放是HTML5标准的一部分,任何元素都能够拖放 ...

  7. html拖放数据库字段,HTML5 拖放(Drag 和 Drop)

    拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. #div1 {width:350px;height:70px;padding:10p ...

  8. HTML5原生拖拽/拖放(drag drop)详解

    前言 拖放(drap && drop)在我们平时的工作中,经常遇到.它表示:抓取对象以后拖放到另一个位置.目前,它是HTML5标准的一部分.我从几个方面学习并实践这个功能. 拖放的流程 ...

  9. Android 用户界面---拖放(Drag and Drop)(二)

    拖拽事件监听器和回调方法 View对象既可以用实现View.OnDragListener接口的拖放事件监听器,也可以用View对象的onDragEvent(DragEvent)回调方法来接收拖拽事件. ...

  10. html5拖放详解,HTML5拖拽/拖放(drag drop)详解

    H5中拖拽属性: draggable: auto | true | false 拖动事件: - dragstart 在元素开始被拖动时触发 - dragend 在拖动操作完成时触发 - drag 在元 ...

最新文章

  1. 在机械狗上利用AstraPro3D深度摄像头简单实现目标跟踪和人体姿态识别
  2. 资源 | 25个深度学习开源数据集,have fun !
  3. 【数字信号处理】傅里叶变换性质 ( 序列傅里叶变换共轭对称性质 | 实序列的幅频特性偶对称 | 实序列相频特性奇对称 | 示例说明 )
  4. poj-1284(Primitive Roots)(欧拉函数运用)
  5. Entity Framewrok 7beta7中不同版本sql server自动生成分页sql语句的问题
  6. 信元模式mpls 避免环路_呼吸机常见通气模式及参数调节
  7. oracle rac添加用户组,oracle 11g rac 与 oracle 10 rac所需要建立的组和用户
  8. 【AI视野·今日Robot 机器人论文速览 第三十一期】Fri, 15 Apr 2022
  9. python爬虫知识点总结(二十四)Scrapy爬去知乎用户信息
  10. php7 viewmodel,【初念科技】| php框架实例: Laravel之Model Observer模型
  11. paip.python错误解决15
  12. RF 无法连接到服务器,这可能由于连接的服务不存在,TCP 错误代码 10061
  13. win10,对于VNR无法使用OCR光学识别的方法,仿照大佬们所讲,图解
  14. MAC Photoshop标题栏不见了
  15. Python 进阶视频课 - 14. FR007 利率掉期定价和曲线拔靴
  16. #2297. 战争调度(war)
  17. 奔驰c260语言设置方法图解,奔驰C260L灯光使用方法 C260L灯光开关图解说明
  18. 三毛经典人生励志语录
  19. week3 day3 迭代器和生成器
  20. 安装python卡到不动了_pip卡住不动的解决方案

热门文章

  1. 谷歌学术镜像mark
  2. greenDAO简单使用经验
  3. Creator+微信小游戏:(3)微信openID获取(https、wss问题)
  4. SpringBoot+Vue实现前后端分离的旅游推荐网站
  5. 2019年终总结-坚持的力量
  6. 耿建超英语语法---非谓语动词作主语
  7. git push reject : pre-receive hook declined
  8. x86_64-w64-mingw32/bin/ld.exe: cannot find -lmsvcrt
  9. activex控件无法安装解决方法
  10. 万用表测占空比怎么接_万用表的占空比是什么意思?