PyQtでドラッグアンドドロップを実装する
ドラッグアンドドロップの利点
- ファイルやURLといった情報を直感的かつキーボードを使わないで入力できる
- アプリケーションの起動手続きとして使える
- ソフトによって使われ方はさまざま
今回はファイルやURLのドラッグアンドドロップについて扱います。
PyQtでのドラッグアンドドロップをするには
- QWidgetを継承したクラスを実装するだけ
- QTextEditのように独自のメソッドを持つものもあるので注意
サンプル (dropwidget.py)
import sys from PyQt5.QtWidgets import * class DropWidget(QWidget): def __init__(self, parent=None): super(DropWidget, self).__init__(parent) self.setAcceptDrops(True) def dragEnterEvent(self, event): event.accept() mimeData = event.mimeData() print('dragEnterEvent') for mimetype in mimeData.formats(): print('MIMEType:', mimetype) print('Data:', mimeData.data(mimetype)) print() print() def dropEvent(self, event): event.accept() mimeData = event.mimeData() print('dropEvent') for mimetype in mimeData.formats(): print('MIMEType:', mimetype) print('Data:', mimeData.data(mimetype)) print() print() def main(): app = QApplication(sys.argv) w = DropWidget() w.resize(800, 600) w.show() w.raise_() app.exec_() if __name__ == '__main__': main()
dragEnterEvent()はドラッグされてきた時のイベントハンドラ。 dropEvent()はドロップされた時のイベントハンドラ。 どちらも、event.mimeData()でQMimeDataのインスタンスが取り出せる。 ドロップおよびドラッグされてきた時に、受け入れられるMIMEまたはデータがあればevent.accept()を呼び出し、 その後、ドロップされてきたデータに対する処理をする。