美文网首页Python Qt GUI设计
Python Qt GUI设计:QDrag拖拽数据传输类(基础篇

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

作者: 不脱发的程序猿 | 来源:发表于2021-11-28 21:02 被阅读0次

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

    基于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 sys

    from 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_())

    相关文章

      网友评论

        本文标题:Python Qt GUI设计:QDrag拖拽数据传输类(基础篇

        本文链接:https://www.haomeiwen.com/subject/gnvhxrtx.html