개발/PyQt&Python

PyQt pdf파일 drag/drop으로 가져오기

알 수 없는 사용자 2022. 11. 8.
반응형

PDF 파일을 드래그/드롭으로 가져오는 방법입니다.

 

 

이렇게 pdf파일을 끌어오면 읽게 됩니다.

 

#파일 끌어오는 부분
class FileLabel(QLabel):
    def __init__(self):
        super().__init__()

        self.setAlignment(Qt.AlignCenter)
        self.setText('파일을 끌어오세요')
        self.setStyleSheet('''
            QLabel{
                border: 4px dashed #aaa;
                font-size: 15pt;
                font-family:'Malgun Gothic';
            }
        ''')

파일을 끌어오는 화면 부분입니다.

setStyleSheet 부분에 원하는 스타일을 주면 됩니다.

 

#파일 끌어오기
    def dragEnterEvent(self, event):
        if self.find_pdf(event.mimeData()):
            event.accept()
        else:
            event.ignore()

파일을 끌어오는 부분입니다.

find_pdf로 끌어온 파일이 pdf인지 확인합니다.

pdf가 맞다면 다음으로 넘어갑니다. pdf가 아닐 경우 끌어와지지 않습니다.

 

    def find_pdf(self, mimedata):
        urls = list()
        db = QMimeDatabase()
        for url in mimedata.urls():
            mimetype = db.mimeTypeForUrl(url)
            if mimetype.name() == "application/pdf":
                urls.append(url)
        return urls

pdf 파일이 맞는지 검증하는 함수입니다.

끌어온 파일 중 pdf만 urls에 담아서 전달합니다.

 

#파일 놓기
    def dropEvent(self, event):
        urls = self.find_pdf(event.mimeData())
        if urls:
            for url in urls:
                print(url.toLocalFile())
            event.accept()
        else:
            event.ignore()

파일을 끌어서 놓았을 때 처리되는 함수입니다.

print(url.toLocalFile()) 부분에 처리할 내용을 넣으시면 됩니다.

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout, QMessageBox
from PyQt5.QtCore import Qt, QMimeDatabase

#파일 끌어오는 부분
class FileLabel(QLabel):
    def __init__(self):
        super().__init__()

        self.setAlignment(Qt.AlignCenter)
        self.setText('파일을 끌어오세요')
        self.setStyleSheet('''
            QLabel{
                border: 4px dashed #aaa;
                font-size: 15pt;
                font-family:'Malgun Gothic';
            }
        ''')

class MyApp(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(400, 400)
        self.setAcceptDrops(True)

        layout = QVBoxLayout()

        self.filebox = FileLabel()
        layout.addWidget(self.filebox)

        self.setLayout(layout)
        self.setWindowTitle('파일 drap/drop')

    #파일 끌어오기
    def dragEnterEvent(self, event):
        if self.find_pdf(event.mimeData()):
            event.accept()
        else:
            event.ignore()

    def dragMoveEvent(self, event):
        if self.find_pdf(event.mimeData()):
            event.accept()
        else:
            event.ignore()

    #파일 놓기
    def dropEvent(self, event):
        urls = self.find_pdf(event.mimeData())
        if urls:
            for url in urls:
                print(url.toLocalFile())
            event.accept()
        else:
            event.ignore()

    def find_pdf(self, mimedata):
        urls = list()
        db = QMimeDatabase()
        for url in mimedata.urls():
            mimetype = db.mimeTypeForUrl(url)
            if mimetype.name() == "application/pdf":
                urls.append(url)
        return urls

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = MyApp()
    myWindow.show()
    app.exec_()

전체 소스입니다.

반응형

댓글

💲 추천 글