bravo's blog

マルチプラットフォームGUIツールキット+軽量言語であるPyQtのプログラミングとか | Pythonのお仕事も募集してます(twitterからDMできます)

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