PyQt5 QMainWindowにファイルをドロップ

2020/04/05 categories:PyQt5| tags:Python|PyQt5|dropEvent|

QMainWindowにファイルをドロップするプログラムを作成してみました。

ウィンドウの表示

今回のテストプログラムは、ドロップしたファイルのパスをテキストブラウザに表示するプログラムとするため、まずはQTextBrowserをCentralWidgetに追加したQMainWindowを表示するプログラムを作成します。これでウィンドウが表示されます。

## -*- coding: utf-8 -*-
import sys
from pathlib import Path
from PyQt5 import QtWidgets

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, app):
        super().__init__()

        self.textBrowser = QtWidgets.QTextBrowser(self)
        self.setCentralWidget(self.textBrowser)
        
def main():
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow(app)
    window.show()
    app.exec()
 
if __name__ == '__main__':
    main()

ドロップの許可とドラッグイベントとドロップイベントのオーバーライド

まずはウィンドウにドロップの許可を与える為に__init__()内でsetAcceptDropsでドロップを許可します。

def __init__(self, app):
    super().__init__()
    self.setAcceptDrops(True)

次にドラッグイベントをオーバーライドして、ドラッグされたデータがQUrlである場合はイベントを許可、そうでなければ許可しないという処理を追加します。

def dragEnterEvent(self, event):
    if event.mimeData().hasUrls():
        event.accept()
    else:
        event.ignore()

ドロップ時のイベントはdropEvent()をオーバーライドします。ドロップしたデータはevent.mimeData().urls()で取得して、QUrlをtoLocalFile()でパスに変換します。変換したパスはテキストブラウザに表示してみました。

def dropEvent(self, event):
    urls = event.mimeData().urls()
    paths = [ Path(url.toLocalFile()) for url in urls ]

    self.textBrowser.setText( '\n'.join([str(p) for p in paths]) )

ソースコード

## -*- coding: utf-8 -*-
import sys
from pathlib import Path
from PyQt5 import QtWidgets

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, app):
        super().__init__()

        self.textBrowser = QtWidgets.QTextBrowser(self)
        self.setCentralWidget(self.textBrowser)

        self.setAcceptDrops(True)
        
    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls():
            event.accept()
        else:
            event.ignore()
    
    def dropEvent(self, event):
        urls = event.mimeData().urls()
        paths = [ Path(url.toLocalFile()) for url in urls ]

        self.textBrowser.setText( '\n'.join([str(p) for p in paths]) )

def main():
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow(app)
    window.show()
    app.exec()
 
if __name__ == '__main__':
    main()

Share post

Related Posts

コメント