PyQt 개발 강좌: QFileSystemModel을 통한 파일 탐색기 구현
이번 강좌에서는 PyQt를 활용하여 간단한 파일 탐색기를 구현하는 방법에 대해 알아보겠습니다. QFileSystemModel
클래스를 통해 파일 시스템의 구조를 시각적으로 표현하고, 사용자와의 상호작용을 통해 파일 및 디렉토리를 탐색할 수 있는 애플리케이션을 만들어 보겠습니다.
1. PyQt 개요
PyQt는 Python으로 Qt 애플리케이션을 생성하기 위한 바인딩입니다. Qt는 크로스 플랫폼 GUI 툴킷으로, 다양한 플랫폼에서 네이티브 애플리케이션을 개발할 수 있게 해줍니다. PyQt를 사용하면 Python의 편리함과 Qt의 강력한 GUI 기능을 결합할 수 있습니다.
2. QFileSystemModel 소개
QFileSystemModel
은 Qt에서 제공하는 파일 시스템 모델 클래스입니다. 이 모델은 로컬 파일 시스템의 구조를 트리 형태로 표현하며, 파일 및 디렉토리에 대한 정보(이름, 크기, 수정 시간 등)를 쉽게 관리할 수 있도록 해줍니다. 이를 통해 파일 탐색기와 같은 애플리케이션에서 활용할 수 있습니다.
3. 프로젝트 환경 설정
먼저 PyQt5가 설치되어 있어야 합니다. 아래의 명령어를 통해 PyQt5를 설치할 수 있습니다:
pip install PyQt5
프로젝트 폴더를 생성하고, 아래와 같이 파일 탐색기 애플리케이션의 기본 구조를 설정합니다:
project/
├── file_explorer.py
└── requirements.txt
4. 기본 코드 작성
이제 file_explorer.py
파일에 코드를 작성하여 GUI 애플리케이션을 구현해보도록 하겠습니다. 아래는 기본적인 애플리케이션의 코드입니다.
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTreeView, QVBoxLayout, QWidget
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import QFileSystemModel
class FileExplorer(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('파일 탐색기')
self.setGeometry(100, 100, 800, 600)
self.setWindowIcon(QIcon('icon.png')) # 아이콘 설정
self.model = QFileSystemModel()
self.model.setRootPath('') # 루트 경로 설정
self.treeView = QTreeView()
self.treeView.setModel(self.model)
self.treeView.setRootIndex(self.model.index('')) # 시작 경로 설정
self.layout = QVBoxLayout()
self.layout.addWidget(self.treeView)
container = QWidget()
container.setLayout(self.layout)
self.setCentralWidget(container)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = FileExplorer()
window.show()
sys.exit(app.exec_())
위 코드는 PyQt를 사용하여 기본적인 파일 탐색기 애플리케이션을 생성합니다. FileExplorer
클래스에서 QFileSystemModel
을 생성하고 QTreeView
를 설정하여 파일 시스템의 트리를 표시합니다.
5. 코드 설명
- QApplication: PyQt 애플리케이션을 시작하는 데 필요한 클래스로, 모든 PyQt 프로그램은 이 클래스로부터 시작됩니다.
- QMainWindow: 주 창으로 사용하는 클래스입니다. 여기서 모든 위젯을 담는 레이아웃을 만들고 관리합니다.
- QFileSystemModel: 파일 시스템의 정보를 модел링하며, 트리 구조로 표시하는 데 사용됩니다.
setRootPath
메서드를 통해 루트 경로를 설정하면 해당 경로에 있는 파일 및 디렉토리를 읽어옵니다. - QTreeView:
QFileSystemModel
을 시각적으로 표시하는 데 사용됩니다.setModel
메서드를 통해 모델을 설정하고setRootIndex
메서드를 사용해 시작 경로를 설정합니다.
6. 기능 추가하기
이제 기본적인 파일 탐색기가 완성되었으니, 몇 가지 기능을 추가해보겠습니다. 다음과 같은 기능을 구현할 예정입니다:
- 파일 및 디렉토리 선택 시 정보 표시
- 파일을 열기 위한 Kontext 메뉴 추가
6.1 정보 표시 기능
트리 뷰에서 파일이나 디렉토리를 선택할 때 해당 정보(이름, 크기, 수정 시간 등)를 표시하는 기능을 추가하겠습니다. 이를 위해 treeView
의 선택 신호를 연결하여 정보를 표시하는 메소드를 작성합니다.
from PyQt5.QtWidgets import QLabel
class FileExplorer(QMainWindow):
def __init__(self):
super().__init__()
# ... 기존 코드 ...
self.infoLabel = QLabel('정보가 여기에 표시됩니다.')
self.layout.addWidget(self.infoLabel)
# 신호 연결
self.treeView.clicked.connect(self.showFileInfo)
def showFileInfo(self, index):
file_path = self.model.filePath(index)
file_size = self.model.fileSize(index)
modified_date = self.model.fileTime(index)
info_text = f'파일 경로: {file_path}
파일 크기: {file_size} bytes
수정 날짜: {modified_date}'
self.infoLabel.setText(info_text)
이제 파일이나 디렉토리를 클릭하면 해당 정보가 아래 레이블에 표시됩니다.
6.2 Kontext 메뉴 추가하기
파일 오른쪽 클릭 시 열 수 있는 컨텍스트 메뉴를 추가해보겠습니다. 이를 통해 사용자가 파일을 쉽게 열 수 있게 합니다.
from PyQt5.QtWidgets import QMenu
class FileExplorer(QMainWindow):
def __init__(self):
super().__init__()
# ... 기존 코드 ...
self.treeView.setContextMenuPolicy(Qt.CustomContextMenu)
self.treeView.customContextMenuRequested.connect(self.openContextMenu)
def openContextMenu(self, position):
menu = QMenu(self)
open_action = menu.addAction('열기')
action = menu.exec_(self.treeView.viewport().mapToGlobal(position))
if action == open_action:
index = self.treeView.indexAt(position)
file_path = self.model.filePath(index)
# 여기서 파일을 여는 로직을 추가합니다
self.openFile(file_path)
def openFile(self, file_path):
import os
os.startfile(file_path) # Windows에서 파일 열기
위 코드를 통해 파일을 오른쪽 클릭했을 때 ‘열기’ 옵션이 나타나며, 선택할 경우 해당 파일을 열 수 있게 됩니다.
7. 마무리
이로써 기본적인 파일 탐색기를 만드는 방법과 QFileSystemModel
을 활용한 PyQt 애플리케이션 개발에 대해 알아보았습니다. 이 프로젝트를 통해 PyQt의 기본적인 구조와 기능을 이해할 수 있으며, 파일 시스템 모델을 사용하여 다양한 파일 관련 작업을 수행할 수 있는 방법을 익힐 수 있습니다.
추가적으로, 다양한 기능을 추가하여 파일 탐색기를 더욱 발전시켜보는 것도 좋은 학습이 될 것입니다. 예를 들어, 검색 기능, 파일 삭제, 복사, 이동 등의 기능을 구현해보는 것을 추천드립니다.
앞으로도 PyQt에 대한 더 많은 내용을 다룰 예정이니 계속해서 많은 관심 부탁드립니다!
감사합니다.