天天看點

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類型:

Python Qt GUI設計:QDrag拖拽資料傳輸類(基礎篇—18)
許多QWidget對象都支援拖曳動作,允許拖曳資料的控件必須設定QWidget.setDragEnabled()為True。另外,控件應該響應拖曳事件,以便存儲所拖曳的資料。常用的拖曳事件如下表所示:
Python Qt GUI設計:QDrag拖拽資料傳輸類(基礎篇—18)
通個示例了解QDrag拖拽資料傳輸類,示例效果如下所示:
Python Qt GUI設計:QDrag拖拽資料傳輸類(基礎篇—18)

示例中,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_())