PyQt5 QMainWindowにドロップ可能なファイルの拡張子を制限する

2020/04/06 categories:PyQt5| tags:Python|PyQt5|dropEvent|Suffix|

前回作ったファイルのドロップイベントは全ての拡張子のファイルをドロップできるプログラムでした。一般的なプログラムではドロップできるファイルの拡張子を制限していることが多いので、ドロップ可能な拡張子を制限するプログラムを作成しました。

ドロップ可能な拡張子リスト

MainWindowクラスのプロパティにallow_suffixesというリストを用意して、その中に拡張子を入れるようにしました。複数指定したい場合も考慮してリストとしています。

self.allow_suffixes = ['.png', '.pdf']

拡張子の比較とドロップ許可

MainWindowにドラッグしたファイルのパスは、event.mimeData().urls()でQUrlとして取得できます。そのQUrlのリストをpathlibのPathに変換します。

urls = event.mimeData().urls()
paths = [ Path(url.toLocalFile()) for url in urls ]

Pathのリストから重複無しの拡張子リストを作成します。そのリストから許可したい拡張子を削除していきます。

suffixes = list( set([ path.suffix for path in paths ]) )
for suffix in self.allow_suffixes:
    if suffix in suffixes:
        suffixes.remove(suffix)

リストのサイズが0より大きければ、許可する拡張子以外が含まれていることになるので、event.ignore()でドロップを許可しないようにすると、指定した拡張子以外ではドロップできないようになります。

if len(suffixes) > 0:
    event.ignore()
else:
    event.accept()

ソースコード

## -*- 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)
        self.allow_suffixes = ['.png', '.pdf']
        
    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls():

            urls = event.mimeData().urls()
            paths = [ Path(url.toLocalFile()) for url in urls ]
            suffixes = list( set([ path.suffix for path in paths ]) )
            for suffix in self.allow_suffixes:
                if suffix in suffixes:
                    suffixes.remove(suffix)

            if len(suffixes) > 0:
                event.ignore()
            else:
                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

コメント