소프트웨어/Python

PYQT5 Drag & Drop 기능

Nerd Dog 2024. 2. 25. 20:14
 

 

파일을 탐색기로 일일이 찾고 넣는 게 불편해서 간편하게 인식시키는 방법이 있을까 고민하다가 찾았다. PYQT5에서 프로그램으로 파일이나 폴더를 Drag & Drop으로 인식시킬 수 있다.


기능 소개

 

 

전체 코드

from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
from PyQt5.QtGui import QIcon

route_first = "경로 : "

class MyApp(QWidget):

    def __init__(self):
      super().__init__()
      self.initUI()

    def initUI(self):
        self.setWindowTitle('CheckFileRoute')
        self.setWindowIcon(QIcon('resources/faviconV2.png'))
        self.setGeometry(500, 300, 500, 300)
        #드래그 드롭을 활성화하려면 True로 변경할 것!
        self.setAcceptDrops(True)

        #레이아웃 설정
        layout = QVBoxLayout()
        
        #라벨 생성 및 레이아웃 추가
        self.label = QLabel(route_first,self)
        layout.addWidget(self.label)
        self.setLayout(layout)

        self.show()

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

    def dropEvent(self, event):
        labelword = ""
        files = [u.toLocalFile() for u in event.mimeData().urls()]
        for f in files:
            print(f)
            labelword += route_first + f +"\n"

        self.label.setText(labelword)


if __name__ == '__main__':
  app = QApplication([])
  myapp = MyApp()
  app.exec_()

 

 

 

일단 눈여겨봐야 할 점은 3가지인데

 

Drag & Drop을 앱에서 활성화하려면 위젯이나 메인 윈도우에서

self.setAcceptDrops(True)

 

이거를 선언해 줘야 된다.

 

또한 미리 선언된 두 함수를 오버라이드 하여 어느 상황에서 파일을 받아들이고(dragEnterEvent) 파일을 받아들인 후 어떤 행동(dropEvent)을 할 것인지를 정해주면 될 것이다. 가져온 파일 정보는 event를 통해 알 수 있다.

 

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

def dropEvent(self, event):
    labelword = ""
    files = [u.toLocalFile() for u in event.mimeData().urls()]
    for f in files:
        print(f)
        labelword += route_first + f +"\n"

    self.label.setText(labelword)

 


3개 drag & drop 하면 다음과 같이 나온다.