PyQt5 - Sürükle ve Bırak

Hükmü drag and dropkullanıcı için çok sezgiseldir. Kullanıcının nesneleri bir pencereden diğerine kopyalayabildiği veya taşıyabildiği birçok masaüstü uygulamasında bulunur.

MIME tabanlı sürükle ve bırak veri aktarımı, QDrag sınıf. QMimeDatanesneler, verileri karşılık gelen MIME türleriyle ilişkilendirir. Panoya kaydedilir ve daha sonra sürükle bırak işleminde kullanılır.

Aşağıdaki QMimeData sınıfı işlevleri, MIME türünün algılanmasına ve uygun şekilde kullanılmasına izin verir.

Test cihazı Alıcı Setter MIME Türleri
hasText () Metin() Metin ayarla() metin / düz
hasHtml () html () setHtml () text / html
hasUrls () url'ler () setUrls () text / uri-list
hasImage () imageData () setImageData () resim / *
hasColor () colorData () setColorData () uygulama / x-color

Birçok QWidget nesnesi, sürükle ve bırak etkinliğini destekler. Verilerinin sürüklenmesine izin verenlerin setDragEnabled () değeri true olarak ayarlanmalıdır. Öte yandan, widget'ların, içine sürüklenen verileri depolamak için sürükle ve bırak olaylarına yanıt vermesi gerekir.

  • DragEnterEvent sürükleme eylemi girdiğinde hedef parçacığa gönderilen bir olay sağlar.

  • DragMoveEvent sürükle ve bırak eylemi devam ederken kullanılır.

  • DragLeaveEvent sürükle ve bırak eylemi widget'tan çıkarken oluşturulur.

  • DropEventÖte yandan, düşüş tamamlandığında gerçekleşir. Olayın önerilen eylemi şartlı olarak kabul edilebilir veya reddedilebilir.

Misal

Aşağıdaki kodda, DragEnterEventOlayın MIME verilerinin metin içerip içermediğini doğrular. Evet ise, olayın önerilen eylemi kabul edilir ve metin ComboBox'a yeni bir öğe olarak eklenir.

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("Type some text in textbox and drag it into combo box"))
   
      edit = QLineEdit()
      edit.setDragEnabled(True)
      com = combo("Button", self)
      lo.addRow(edit,com)
      self.setLayout(lo)
      self.setWindowTitle('Simple drag and drop')
def main():
   app = QApplication(sys.argv)
   ex = Example()
   ex.show()
   app.exec_()

if __name__ == '__main__':
   main()

Yukarıdaki kod aşağıdaki çıktıyı üretir -