写点什么

Python Qt GUI 设计:QDrag 拖拽数据传输类(基础篇—18)

  • 2021 年 11 月 28 日
  • 本文字数:1231 字

    阅读完需:约 4 分钟

Python Qt GUI设计:QDrag拖拽数据传输类(基础篇—18)

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

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

MIME(Multipurpose Internet Mail Extension,多用途互联网邮件扩展类型)是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问时,浏览器会自动使用指定的应用程序来打开,多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。 每种 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

如下表所示的 MimeData 类函数允许检测和使用方便的 MIME 类型:

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

通个示例了解 QDrag 拖拽数据传输类,示例效果如下所示:

示例中,DragEnterEvent 会验证事件的 MIME 数据是否包含字符串文本,如果包含字符串文本,就接收事件提出的添加文本操作,并将文本作为新条目(ltem)添加到 ComboBox 控件中,否则忽略此次操作。

实现代码如下所示:

import sysfrom PyQt5.QtCore import *from PyQt5.QtGui import *from PyQt5.QtWidgets import *   class Combo(QComboBox): 	def __init__(self, title, parent):		super(Combo, self).__init__( parent)		self.setAcceptDrops(True)			def dragEnterEvent(self, e):		print(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)		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_())
复制代码


发布于: 2 小时前阅读数: 5
用户头像

【研究方向】物联网、嵌入式、AI、Python 2018.02.09 加入

【公众号】美男子玩编程,关注获取海量资源~

评论

发布
暂无评论
Python Qt GUI设计:QDrag拖拽数据传输类(基础篇—18)