python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例


Posted in Python onFebruary 27, 2020

PyQt5数据拖曳Drag与Drop介绍

为用户提供的拖曳功能很直观,在很对桌面应用程序中,复制或移动对象都可以通过拖曳来完成

基于MIME类型的拖曳数据传输是基于QDrag类的,QMimeData对象将关联的数据与其对应的MIME类型相关联

MIME意为多功能Internet邮件扩展,它设计的最初目的是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。然而当它被HTTP协议支持之后,它的意义就更为显著了。它使得HTTP传输的不仅是普通的文本,而变得丰富多彩。

每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。

常见的MIME类型(通用型):

超文本标记语言文本 .html text/html

xml文档 .xml text/xml

XHTML文档 .xhtml application/xhtml+xml

普通文本 .txt text/plain

RTF文本 .rtf application/rtf

PDF文档 .pdf application/pdf

Microsoft Word文件 .word application/msword

PNG图像 .png image/png

GIF图形 .gif image/gif

JPEG图形 .jpeg,.jpg image/jpeg

au声音文件 .au audio/basic

MIDI音乐文件 mid,.midi audio/midi,audio/x-midi

RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio

MPEG文件 .mpg,.mpeg video/mpeg

AVI文件 .avi video/x-msvideo

GZIP文件 .gz application/x-gzip

TAR文件 .tar application/x-tar

任意的二进制数据 application/octet-stream

MIME类型的数据可以简单的理解为互联网上的各种资源,比如文本,音频和图片等资源,互联网上的每一种资源都属于一种MIME类型的数据

MimeData类函数允许检测和使用方便的MIME类型

判断函数 设置函数 获取函数 MIME类型
hasText() text() setText() text/plain
hasHtml() html() setHtml() text/html
hasUrls() urls() setUrls() text/url-list
hasImage() imageData() setImageData image/*
hasColor() colorData() setColrDaata() application/x-color

许多QWidget对象都支持拖曳动作,允许拖曳数据的控件必须设置QWidget.setDragEnabled()为True,另外,控件应该响应拖曳事件,以便储存所拖曳的数据

常用的拖曳事件如表

事件 描述
DragEnterEvent 当执行一个拖曳控件操作,并且鼠标指针进入该控件时,这个事件将会被触发。在这个事件中可以获得被操作的窗口控件,还可以有条件地接受或拒绝该拖曳操作
DragMoveEvent 在拖曳操作进行时会触发该事件
DragLeaveEvent 当执行一个拖曳操作,并且鼠标指针离开该控件时,这个事件被触发
DropEvent 当拖曳操作在其目标控件上被释放时,这个事件将被触发

Drag拖曳功能实例

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

class Combo(QComboBox):
  def __init__(self,title,parent):
    super(Combo, self).__init__(parent)
    #设置为可接受拖曳操作文本
    self.setAcceptDrops(True)

  #当执行一个拖曳控件操作,并且鼠标指针进入该控件时,这个事件将会被触发。
  # 在这个事件中可以获得被操作的窗口控件,还可以有条件地接受或拒绝该拖曳操作
  def dragEnterEvent(self,e):
    #检测拖曳进来的数据是否包含文本,如有则接受,无则忽略
    if e.mimeData().hasText():
      e.accept()
    else:
      e.ignore()
  #当拖曳操作在其目标控件上被释放时,这个事件将被触发
  def dropEvent(self,e):
    #添加拖曳文本到条目中
    self.addItem(e.mimeData().text())
class Example(QWidget):
  def __init__(self):
    super(Example, self).__init__()
    self.initUI()

  def initUI(self):
    #表单布局,添加控件
    lo=QFormLayout()
    lo.addRow(QLabel('请把左边的文本拖曳到右边的下拉菜单中'))

    #实例化单行文本框,设置为允许拖曳操作
    edit=QLineEdit()
    edit.setDragEnabled(True)

    #实例化Combo对象,添加控件到布局中
    com=Combo('Button',self)
    lo.addRow(edit,com)

    #设置主窗口布局及标题
    self.setLayout(lo)
    self.setWindowTitle('简单的拖曳例子')

if __name__ == '__main__':
  app=QApplication(sys.argv)
  ex=Example()
  ex.show()
  sys.exit(app.exec_())

效果如图

python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例

代码分析:

在这个例子中,DragEnterEvent会验证事件的MIM的数据是否包含字符串文本,如果包含字符串文本,就接受事件提出的添加文本操作,并将文本作为新条目(Item)添加到ComboBox控件中,否则忽略这次操作

def dragEnterEvent(self,e):
    #检测拖曳进来的数据是否包含文本,如有则接受,无则忽略
    if e.mimeData().hasText():
      e.accept()
    else:
      e.ignore()

本文主要介绍了PyQt5控件数据拖曳Drag与Drop详细使用方法与实例,更多关于这方面的知识请查看下面的相关链接

Python 相关文章推荐
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
Mar 30 Python
pymongo为mongodb数据库添加索引的方法
May 11 Python
深入讲解Python函数中参数的使用及默认参数的陷阱
Mar 13 Python
Python实现的用户登录系统功能示例
Feb 05 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
Jul 02 Python
深入浅析Python科学计算库Scipy及安装步骤
Oct 12 Python
30秒学会30个超实用Python代码片段【收藏版】
Oct 15 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
Mar 09 Python
3分钟看懂Python后端必须知道的Django的信号机制
Jul 26 Python
python中requests模拟登录的三种方式(携带cookie/session进行请求网站)
Nov 17 Python
Python+Selenium实现读取网易邮箱验证码
Mar 13 Python
python数字图像处理之图像自动阈值分割示例
Jun 28 Python
python脚本实现mp4中的音频提取并保存在原目录
Feb 27 #Python
python列表切片和嵌套列表取值操作详解
Feb 27 #Python
Python递归实现打印多重列表代码
Feb 27 #Python
Python各种扩展名区别点整理
Feb 27 #Python
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
Feb 27 #Python
python程序文件扩展名知识点详解
Feb 27 #Python
python读取多层嵌套文件夹中的文件实例
Feb 27 #Python
You might like
我的论坛源代码(九)
2006/10/09 PHP
php表单提交问题的解决方法
2011/04/12 PHP
php 无限级分类,超级简单的无限级分类,支持输出树状图
2014/06/29 PHP
javascript 类型判断代码分析
2010/03/28 Javascript
JS判断页面加载状态以及添加遮罩和缓冲动画的代码
2012/10/11 Javascript
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
2013/04/17 Javascript
喜大普奔!jQuery发布 3.0 最终版
2016/06/12 Javascript
JS制作类似选项卡切换的年历
2016/12/03 Javascript
漂亮实用的页面loading(加载)封装代码
2017/02/03 Javascript
js实现九宫格拼图小游戏
2017/02/13 Javascript
Bootstrap 响应式实用工具实例详解
2017/03/29 Javascript
微信小程序对接七牛云存储的方法
2017/07/30 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
2017/09/07 Javascript
JavaScript实现计数器基础方法
2017/10/10 Javascript
JS实现获取毫秒值及转换成年月日时分秒的方法
2018/08/15 Javascript
微信小程序第三方框架对比 之 wepy / mpvue / taro
2019/04/10 Javascript
django js 实现表格动态标序号的实例代码
2019/07/12 Javascript
微信小程序模板消息推送的两种实现方式
2019/08/27 Javascript
JS FormData对象使用方法实例详解
2020/02/12 Javascript
python使用urllib2模块获取gravatar头像实例
2013/12/18 Python
Python实现程序的单一实例用法分析
2015/06/03 Python
Python 实现随机数详解及实例代码
2017/04/15 Python
解决python tkinter界面卡死的问题
2019/07/17 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
2019/08/04 Python
Python3 列表,数组,矩阵的相互转换的方法示例
2019/08/05 Python
Python处理session的方法整理
2019/08/29 Python
Python类中self参数用法详解
2020/02/13 Python
python 在sql语句中使用%s,%d,%f说明
2020/06/06 Python
使用 prometheus python 库编写自定义指标的方法(完整代码)
2020/06/29 Python
整理HTML5中表单的常用属性及新属性
2016/02/19 HTML / CSS
英国最出名高街品牌:Forever Unique
2018/02/24 全球购物
汽车机修工岗位职责
2014/03/06 职场文书
2014小学语文教师个人工作总结
2014/12/03 职场文书
2015年助理工程师工作总结
2015/04/03 职场文书
一劳永逸彻底解决pip install慢的办法
2021/05/24 Python
mysql 直接拷贝data 目录下文件还原数据的实现
2021/07/25 MySQL