PyQt5 - Seret dan Jatuhkan

Penyediaan drag and dropsangat intuitif bagi pengguna. Itu ditemukan di banyak aplikasi desktop di mana pengguna dapat menyalin atau memindahkan objek dari satu jendela ke jendela lainnya.

Transfer data seret dan lepas berbasis MIME didasarkan pada QDrag kelas. QMimeDataobjek mengaitkan data dengan tipe MIME yang sesuai. Itu disimpan di clipboard dan kemudian digunakan dalam proses seret dan lepas.

Fungsi kelas QMimeData berikut memungkinkan tipe MIME untuk dideteksi dan digunakan dengan nyaman.

Penguji Getter Setter Jenis MIME
hasText () teks() setText () teks / biasa
hasHtml () html () setHtml () teks / html
hasUrls () url () setUrls () teks / daftar uri
hasImage () imageData () setImageData () gambar / *
hasColor () colorData () setColorData () aplikasi / x-warna

Banyak objek QWidget mendukung aktivitas seret dan lepas. Mereka yang memungkinkan datanya diseret memiliki setDragEnabled () yang harus disetel ke true. Di sisi lain, widget harus merespons peristiwa seret dan lepas untuk menyimpan data yang diseret ke dalamnya.

  • DragEnterEvent menyediakan acara yang dikirim ke widget target saat tindakan menyeret memasukkannya.

  • DragMoveEvent digunakan saat aksi seret dan lepas sedang berlangsung.

  • DragLeaveEvent dibuat saat tindakan seret dan lepas meninggalkan widget.

  • DropEvent, di sisi lain, terjadi saat penurunan selesai. Tindakan yang diusulkan acara tersebut dapat diterima atau ditolak secara bersyarat.

Contoh

Dalam kode berikut, file DragEnterEventmemverifikasi apakah data MIME acara berisi teks. Jika ya, tindakan yang diusulkan acara diterima dan teks ditambahkan sebagai item baru di ComboBox.

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

Kode di atas menghasilkan keluaran sebagai berikut -