Python Qt GUI設(shè)計:QDrag拖拽數(shù)據(jù)傳輸類(基礎(chǔ)篇—18)
為用戶提供的拖曳功能很直觀,在很多桌面應(yīng)用程序中,復(fù)制或移動對象都可以通過拖曳來完成。
基于MIME類型的拖曳數(shù)據(jù)傳輸是基于QDrag類的。QMimeData對象將關(guān)聯(lián)的數(shù)據(jù)與其對應(yīng)的MIME類型相關(guān)聯(lián)。
MIME(Multipurpose Internet Mail Extension,多用途互聯(lián)網(wǎng)郵件擴展類型)是設(shè)定某種擴展名的文件用一種應(yīng)用程序來打開的方式類型,當(dāng)該擴展名文件被訪問時,瀏覽器會自動使用指定的應(yīng)用程序來打開,多用于指定一些客戶端自定義的文件名,以及一些媒體文件打開方式。
每種MIME類型都由兩部分組成,前面是數(shù)據(jù)的大類別,如聲音audio、圖像image等,后面定義具體的種類。
常見的MIME類型(通用型)如下:
超文本標(biāo)記語言文本 .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
任意的二進制數(shù)據(jù) application/octet-stream
如下表所示的MimeData類函數(shù)允許檢測和使用方便的MIME類型:
許多QWidget對象都支持拖曳動作,允許拖曳數(shù)據(jù)的控件必須設(shè)置QWidget.setDragEnabled()為True。另外,控件應(yīng)該響應(yīng)拖曳事件,以便存儲所拖曳的數(shù)據(jù)。常用的拖曳事件如下表所示:
通個示例了解QDrag拖拽數(shù)據(jù)傳輸類,示例效果如下所示:
示例中,DragEnterEvent會驗證事件的MIME數(shù)據(jù)是否包含字符串文本,如果包含字符串文本,就接收事件提出的添加文本操作,并將文本作為新條目(ltem)添加到ComboBox控件中,否則忽略此次操作。
實現(xiàn)代碼如下所示:
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_())
往期推薦

