為使用者提供的拖曳功能很直覺,在很多桌面應用程式中,複制或移動對象都可以通過拖曳來完成。
基于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類型:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CNlRTMlVmZ4MDZ4MmYlZGO5QDN0QWZ2MmZkFWOlVWN08CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
示例中,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_())