Python PyQt5 数据拖曳 Drag 与 Drop 详细使用方法与实例
本文详细介绍 PyQt5 中数据拖曳(Drag and Drop)功能的实现原理与使用方法。内容涵盖 MIME 类型在数据传输中的作用、QMimeData 类的关键函数,以及通过继承 QComboBox 实现拖曳文本到下拉框的完整代码示例。
PyQt5 数据拖曳(Drag)与放置(Drop)功能介绍
该功能为用户提供了直观的交互体验,在多数桌面应用程序中,复制或移动对象均可通过拖曳操作完成。
基于 MIME 类型的拖曳数据传输依赖于 QDrag 类,其中 QMimeData 对象负责将关联的数据与其对应的 MIME 类型进行绑定。
MIME(Multipurpose Internet Mail Extensions)意为多功能 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() 对应 text/plain,hasHtml() 和 html() 对应 text/html,hasUrls() 和 urls() 对应 text/url-list,hasImage() 和 imageData() 对应 image/*,以及 hasColor() 和 colorData() 对应 application/x-color。
| 判断函数 | 设置函数 | 获取函数 | 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(拖曳操作在目标控件上释放时触发)。
| 事件 | 描述 |
|---|---|
| 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_())
运行效果如图所示。

代码分析:
在此示例中,DragEnterEvent 验证事件中的 MIME 数据是否包含字符串文本。若包含,则接受事件提出的添加文本操作,并将文本作为新条目(Item)添加到 ComboBox 控件中;否则忽略该操作。
def dragEnterEvent(self,e):
#检测拖曳进来的数据是否包含文本,如有则接受,无则忽略
if e.mimeData().hasText():
e.accept()
else:
e.ignore()
本文主要介绍了 PyQt5 控件数据拖曳(Drag 与 Drop)的详细使用方法与实例,更多关于这方面的知识请查看下面的相关链接
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













