Python Qt GUI设计:QDrag拖拽数据传输类(基础篇—18)
為用戶提供的拖曳功能很直觀,在很多桌面應(yīng)用程序中,復(fù)制或移動(dòng)對(duì)象都可以通過拖曳來完成。
基于MIME類型的拖曳數(shù)據(jù)傳輸是基于QDrag類的。QMimeData對(duì)象將關(guān)聯(lián)的數(shù)據(jù)與其對(duì)應(yīng)的MIME類型相關(guān)聯(lián)。
MIME(Multipurpose Internet Mail Extension,多用途互聯(lián)網(wǎng)郵件擴(kuò)展類型)是設(shè)定某種擴(kuò)展名的文件用一種應(yīng)用程序來打開的方式類型,當(dāng)該擴(kuò)展名文件被訪問時(shí),瀏覽器會(huì)自動(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
- 任意的二進(jìn)制數(shù)據(jù) application/octet-stream
如下表所示的MimeData類函數(shù)允許檢測(cè)和使用方便的MIME類型:
許多QWidget對(duì)象都支持拖曳動(dòng)作,允許拖曳數(shù)據(jù)的控件必須設(shè)置QWidget.setDragEnabled()為True。另外,控件應(yīng)該響應(yīng)拖曳事件,以便存儲(chǔ)所拖曳的數(shù)據(jù)。常用的拖曳事件如下表所示:
通個(gè)示例了解QDrag拖拽數(shù)據(jù)傳輸類,示例效果如下所示:
示例中,DragEnterEvent會(huì)驗(yàn)證事件的MIME數(shù)據(jù)是否包含字符串文本,如果包含字符串文本,就接收事件提出的添加文本操作,并將文本作為新條目(ltem)添加到ComboBox控件中,否則忽略此次操作。
實(shí)現(xiàn)代碼如下所示:
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("請(qǐng)把左邊的文本拖拽到右邊的下拉菜單中"))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_())
總結(jié)
以上是生活随笔為你收集整理的Python Qt GUI设计:QDrag拖拽数据传输类(基础篇—18)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python Qt GUI设计:QPai
- 下一篇: Python Qt GUI设计:QCli