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

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()

コメント

タイトルとURLをコピーしました