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

Share on:

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

ウィンドウの表示

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

 1# -*- coding: utf-8 -*-
 2import sys
 3from pathlib import Path
 4from PyQt5 import QtWidgets
 5
 6class MainWindow(QtWidgets.QMainWindow):
 7    def __init__(self, app):
 8        super().__init__()
 9
10        self.textBrowser = QtWidgets.QTextBrowser(self)
11        self.setCentralWidget(self.textBrowser)
12        
13def main():
14    app = QtWidgets.QApplication(sys.argv)
15    window = MainWindow(app)
16    window.show()
17    app.exec()
18 
19if __name__ == '__main__':
20    main()

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

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

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

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

1def dragEnterEvent(self, event):
2    if event.mimeData().hasUrls():
3        event.accept()
4    else:
5        event.ignore()

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

1def dropEvent(self, event):
2    urls = event.mimeData().urls()
3    paths = [ Path(url.toLocalFile()) for url in urls ]
4
5    self.textBrowser.setText( '\n'.join([str(p) for p in paths]) )

ソースコード

 1# -*- coding: utf-8 -*-
 2import sys
 3from pathlib import Path
 4from PyQt5 import QtWidgets
 5
 6class MainWindow(QtWidgets.QMainWindow):
 7    def __init__(self, app):
 8        super().__init__()
 9
10        self.textBrowser = QtWidgets.QTextBrowser(self)
11        self.setCentralWidget(self.textBrowser)
12
13        self.setAcceptDrops(True)
14        
15    def dragEnterEvent(self, event):
16        if event.mimeData().hasUrls():
17            event.accept()
18        else:
19            event.ignore()
20    
21    def dropEvent(self, event):
22        urls = event.mimeData().urls()
23        paths = [ Path(url.toLocalFile()) for url in urls ]
24
25        self.textBrowser.setText( '\n'.join([str(p) for p in paths]) )
26
27def main():
28    app = QtWidgets.QApplication(sys.argv)
29    window = MainWindow(app)
30    window.show()
31    app.exec()
32 
33if __name__ == '__main__':
34    main()

関連記事