1. 程式人生 > 程式設計 >python GUI庫圖形介面開發之PyQt5控制元件資料拖曳Drag與Drop詳細使用方法與例項

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_())

效果如圖

python GUI庫圖形介面開發之PyQt5控制元件資料拖曳Drag與Drop詳細使用方法與例項

程式碼分析:

在這個例子中,DragEnterEvent會驗證事件的MIM的資料是否包含字串文字,如果包含字串文字,就接受事件提出的新增文字操作,並將文字作為新條目(Item)新增到ComboBox控制元件中,否則忽略這次操作

  def dragEnterEvent(self,e):
    #檢測拖曳進來的資料是否包含文字,如有則接受,無則忽略
    if e.mimeData().hasText():
      e.accept()
    else:
      e.ignore()

本文主要介紹了PyQt5控制元件資料拖曳Drag與Drop詳細使用方法與例項,更多關於這方面的知識請檢視下面的相關連結