python GUI庫圖形介面開發之PyQt5控制元件資料拖曳Drag與Drop詳細使用方法與例項
PyQt5資料拖曳Drag與Drop介紹
為使用者提供的拖曳功能很直觀,在很對桌面應用程式中,複製或移動物件都可以通過拖曳來完成
基於MIME型別的拖曳資料傳輸是基於QDrag類的,QMimeData物件將關聯的資料與其對應的MIME型別相關聯
MIME意為多功能Internet郵件擴充套件,它設計的最初目的是為了在傳送電子郵件時附加多媒體資料,讓郵件客戶程式能根據其型別進行處理。然而當它被HTTP協議支援之後,它的意義就更為顯著了。它使得HTTP傳輸的不僅是普通的文字,而變得豐富多彩。
每個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
MIME型別的資料可以簡單的理解為網際網路上的各種資源,比如文字,音訊和圖片等資源,網際網路上的每一種資源都屬於一種MIME型別的資料
MimeData類函式允許檢測和使用方便的MIME型別
判斷函式 | 設定函式 | 獲取函式 | MIME型別 |
---|---|---|---|
hasText() | text() | setText() | text/plain |
hasHtml() | html() | setHtml() | text/html |
hasUrls() | urls() | setUrls() | text/url-list |
hasImage() | imageData() | setImageData | image/* |
hasColor() | colorData() | setColrDaata() | application/x-color |
許多QWidget物件都支援拖曳動作,允許拖曳資料的控制元件必須設定QWidget.setDragEnabled()為True,另外,控制元件應該響應拖曳事件,以便儲存所拖曳的資料
常用的拖曳事件如表
事件 | 描述 |
---|---|
DragEnterEvent | 當執行一個拖曳控制元件操作,並且滑鼠指標進入該控制元件時,這個事件將會被觸發。在這個事件中可以獲得被操作的視窗控制元件,還可以有條件地接受或拒絕該拖曳操作 |
DragMoveEvent | 在拖曳操作進行時會觸發該事件 |
DragLeaveEvent | 當執行一個拖曳操作,並且滑鼠指標離開該控制元件時,這個事件被觸發 |
DropEvent | 當拖曳操作在其目標控制元件上被釋放時,這個事件將被觸發 |
Drag拖曳功能例項
import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * class Combo(QComboBox): def __init__(self,title,parent): super(Combo,self).__init__(parent) #設定為可接受拖曳操作文字 self.setAcceptDrops(True) #當執行一個拖曳控制元件操作,並且滑鼠指標進入該控制元件時,這個事件將會被觸發。 # 在這個事件中可以獲得被操作的視窗控制元件,還可以有條件地接受或拒絕該拖曳操作 def dragEnterEvent(self,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) #例項化Combo物件,新增控制元件到佈局中 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_())
效果如圖
程式碼分析:
在這個例子中,DragEnterEvent會驗證事件的MIM的資料是否包含字串文字,如果包含字串文字,就接受事件提出的新增文字操作,並將文字作為新條目(Item)新增到ComboBox控制元件中,否則忽略這次操作
def dragEnterEvent(self,e): #檢測拖曳進來的資料是否包含文字,如有則接受,無則忽略 if e.mimeData().hasText(): e.accept() else: e.ignore()
本文主要介紹了PyQt5控制元件資料拖曳Drag與Drop詳細使用方法與例項,更多關於這方面的知識請檢視下面的相關連結