PyQt-ドラッグアンドドロップ

  • ドラッグアンドドロップ*の提供は、ユーザーにとって非常に直感的です。 ユーザーがオブジェクトをあるウィンドウから別のウィンドウにコピーまたは移動できる多くのデスクトップアプリケーションで見られます。

MIMEベースのドラッグアンドドロップデータ転送はQDragクラスに基づいています。 QMimeData オブジェクトは、データを対応するMIMEタイプに関連付けます。 クリップボードに保存され、ドラッグアンドドロッププロセスで使用されます。

次のQMimeDataクラス関数を使用すると、MIMEタイプを簡単に検出して使用できます。

Tester Getter Setter MIME Types
hasText() text() setText() text/plain
hasHtml() html() setHtml() text/html
hasUrls() urls() setUrls() text/uri-list
hasImage() imageData() setImageData() image/*
hasColor() colorData() setColorData() application/x-color

多くのQWidgetオブジェクトは、ドラッグアンドドロップアクティビティをサポートしています。 データのドラッグを許可するものには、trueに設定する必要があるsetDragEnabled()があります。 一方、ウィジェットは、ドラッグアンドドロップイベントに応答して、ドラッグされたデータを保存する必要があります。

  • DragEnterEvent は、ドラッグアクションが入力されるとターゲットウィジェットに送信されるイベントを提供します。
  • DragMoveEvent は、ドラッグアンドドロップアクションの進行中に使用されます。
  • ドラッグアンドドロップアクションがウィジェットを離れると、 DragLeaveEvent が生成されます。
  • 一方、 DropEvent は、ドロップが完了すると発生します。 イベントの提案されたアクションは、条件付きで承認または拒否できます。

次のコードでは、DragEnterEventはイベントのMIMEデータにテキストが含まれているかどうかを確認します。 「はい」の場合、イベントの提案されたアクションが受け入れられ、テキストがComboBoxの新しいアイテムとして追加されます。

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore 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 & drop')

def main():
   app = QApplication(sys.argv)
   ex = Example()
   ex.show()
   app.exec_()

if __name__ == '__main__':
   main()

上記のコードは、次の出力を生成します-

ドラッグアンドドロップ出力