반응형

이제 원하는 폴더만 출력될 수 있도록 filter를 설정해보자. 기본적으로 설정할 수 있는 filter 리스트는 아래 페이지에서 확인할 수 있다.

https://doc.qt.io/qtforpython-5/PySide2/QtCore/QDir.html

 

QDir — Qt for Python

QDir The QDir class provides access to directory structures and their contents. More… Synopsis Functions Static functions Detailed Description A QDir is used to manipulate path names, access information regarding paths and files, and manipulate the under

doc.qt.io

기본적으로 QFileSystemModel에 설정되어있는 filter는 아래와 같다.

If a filter has not been set, the default filter is AllEntries | NoDotAndDotDot | AllDirs.

여기서 우리는 원하는 조건의 폴더만 출력해보자.

먼저 나는 폴더만 출력하고 싶기 때문에 QDir.Dirs 필터를 걸겠다. 아래와 같이 폴더만 불러오게 되었지만 쓸때 없는 ., ..와 같은 표시도 나타나게 되었다. default filter가 사라졌기 때문이다. 다시 QDir.NoDotAndDotDot filter도 설정해주자.

이제 아래와 같이 깔끔하게 폴더명만 나타가게 되었다.

여기서 더 나아가 name filter도 사용해보자. A로 시작하는 폴더명만 보여주는 필터는 다음과 같이 정의할 수 있다.

nameFilters = ['A*']

이에 대한 결과는 다음과 같다. name filter에 걸리지 않은 폴더들은 다음과 같이 비활성화되었다. 비활성화된 폴더들은 선택을 할 수 없게 된다.

이에 대한 코드는 아래와 같다. 객체를 생성해서 함수를 사용할 수도 있지만 나는 CustomFileSystemModel을 정의하고 싶었기에 다음과 같이 사용을 하였다. 

class CustomFileSystemModel(QFileSystemModel):
    def __init__(self):
        super().__init__()
        nameFilters = ['A*']
        self.setNameFilters(nameFilters)
        self.setFilter(QDir.Dirs | QDir.NoDotAndDotDot)

또한 treeview가 펼쳐진 상태로 시작되었으면 한다면 다음과 같은 함수를 사용하면 된다.

self.tree.expandAll()

 

반응형
반응형

어느 정도 사용하는 파일 경로가 정해져 있지만 그때그때 사용하고 싶은 폴더를 여러개 선택할 수 있는 기능을 만들고 싶어졌다.

따라서 QTreeView와 QFileSystemModel을 사용해서 이러한 기능을 만들어보려고 한다.

참고로 PyQt5를 기준으로 구현을 진행하였다.

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

먼저 간단하게 QFileSystemModel을 상속받는 CustomFileSystemModel을 정의해주었다.

class CustomFileSystemModel(QFileSystemModel):
    def __init__(self):
        super().__init__()

그리고 이러한 CustomFileSystemModel를 QTreeView로 불러와 준다.

        self.model = CustomFileSystemModel()
        self.model.setRootPath(QDir.currentPath())

        self.tree =  QTreeView()
        self.tree.setSelectionMode(QAbstractItemView.MultiSelection)
        self.tree.setModel(self.model)

        vbox = QVBoxLayout()
        vbox.addWidget(btn1)
        vbox.addWidget(self.tree)

한번에 여러 아이템을 선택할 수 있도록 MultiSelection 모드로 설정해준다. 또한 간단하게 현재 선택한 아이템 정보를 다이나믹하게 읽을 수 있도록 간단한 버튼을 만들어주었다. 그럼 다음과 같은 화면으로 프로그램이 실행된다.

개인적으로 폴더나 파일의 이름만 불러왔으면 좋겠다. Size, Kind, ... 이런 것들이 뜨지 않게 해보자.

다음과 같이 필요없는 column을 숨겼다. 

        self.tree.hideColumn(1)
        self.tree.hideColumn(2)
        self.tree.hideColumn(3)

아래와 같이 깔끔하게 원하는 이름만 나오는 것을 확인할 수 있다.



이제 선택된 아이템들의 경로를 확인해보자. 버튼을 이용해서 선택된 아이템들의 경로를 print하는 기능을 추가하였다.

    def print(self):
        for idx in self.tree.selectedIndexes():
            print(self.model.filePath(idx))

아래와 같이 여러 개의 아이템을 선택한 후 button1을 누르면 해당 파일의 절대 경로가 나오게 된다.

아래와 같은 절대 경로가 출력된다.

/Library/Apple
/Library/Image Capture

반응형

+ Recent posts