bravo's blog

多分ググっても出てこないようなプログラミング記事を目指します!

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()を呼び出し、 その後、ドロップされてきたデータに対する処理をする。

実行してみましょう


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

この段階での注意点

  • Pythonインタプリタ上での動作であるため、一般配布には向いていない。(事前に動作する環境構築が必要になる)
  • Macではメニューの上の表記が「Python」となり、アイコンも標準的なものになる。 専用のアイコンなどを入れるなど、独立したソフトとして使えるようにしたい時は、名称を付けるにはBundle化が必要になる。

PR