본문 바로가기
코딩취미/Python

QTreeView 트리구조 생성 및 사용방법(+이벤트 처리)

by 브링블링 2024. 9. 10.
반응형

QTreeView 트리구조 생성 및 사용방법(+이벤트 처리)

트리 구조는 계층적 데이터를 시각적으로 표현하는 데 유용한 방법입니다. PySide6의 QTreeView는 이러한 트리 구조 데이터를 효과적으로 관리하고 표시할 수 있도록 돕는 도구입니다. 이 글에서는 PySide6의 QTreeView를 사용하여 트리 구조 데이터를 어떻게 관리하고 표시할 수 있는지에 대해 설명합니다.

 

기본적인 QTreeView의 특징과 주요 기능, 그리고 이를 활용한 트리 구조 데이터를 다루는 방법을 실용적인 예제와 함께 소개합니다. 또한 QTreeView에서 사용할 수 있는 이벤트 처리 방법에 대해 자세히 다룹니다.

 

1. QTreeView의 특징

QTreeView는 계층적 데이터를 시각적으로 표현할 수 있는 위젯으로, 트리 구조 데이터를 관리하고 표시하는 데 주로 사용됩니다. 사용자는 각 계층에 해당하는 데이터를 확장 및 축소하여 편리하게 탐색할 수 있습니다. 다음은 QTreeView의 주요 특징입니다:

  • 계층적 데이터 관리: QTreeView는 여러 레벨로 나뉜 데이터를 효율적으로 표시할 수 있습니다.
  • 동적인 업데이트: 데이터 모델과 연결하여 동적으로 트리 구조를 업데이트할 수 있습니다.
  • 다양한 상호작용 제공: 드래그 앤 드롭, 선택, 확장 및 축소 기능을 제공합니다.
  • 다양한 데이터 형식 지원: 텍스트뿐만 아니라 이미지, 체크박스 등의 다양한 형태로 데이터를 표시할 수 있습니다.

2. QTreeView와 QStandardItemModel의 연결

QTreeView는 단독으로 사용되는 것이 아니라, 트리 구조 데이터를 저장하는 모델과 함께 사용됩니다. 일반적으로 QStandardItemModel을 사용하여 데이터를 관리하며, QStandardItem을 통해 트리 구조의 각 항목을 정의합니다. 아래 예제는 QTreeView와 QStandardItemModel을 연결하여 간단한 트리 구조를 만드는 방법을 보여줍니다.

 

아래 코드에서는 QTreeView와 QStandardItemModel을 사용하여 간단한 트리 구조를 구현했습니다. 부모 항목인 "Root Item"과 두 개의 자식 항목을 추가한 후, QTreeView에서 이를 시각적으로 표현하고 있습니다.

from PySide6.QtWidgets import QApplication, QMainWindow, QTreeView, QStandardItemModel, QStandardItem

class TreeViewExample(QMainWindow):
    def __init__(self):
        super().__init__()

        # QTreeView와 모델 생성
        self.tree_view = QTreeView(self)
        self.model = QStandardItemModel()

        # 모델의 헤더 설정
        self.model.setHorizontalHeaderLabels(['Item', 'Description'])

        # 트리 구조 항목 추가
        parent_item = QStandardItem('Root Item')
        child_item1 = QStandardItem('Child Item 1')
        child_item2 = QStandardItem('Child Item 2')

        # 부모 항목에 자식 항목 추가
        parent_item.appendRow([child_item1, QStandardItem('Child 1 Description')])
        parent_item.appendRow([child_item2, QStandardItem('Child 2 Description')])

        # 모델에 루트 항목 추가
        self.model.appendRow([parent_item, QStandardItem('Root Description')])

        # QTreeView에 모델 설정
        self.tree_view.setModel(self.model)

        # 레이아웃 설정
        self.setCentralWidget(self.tree_view)

if __name__ == "__main__":
    app = QApplication([])
    window = TreeViewExample()
    window.show()
    app.exec()

3. QTreeView에서 트리 항목 확장 및 축소

QTreeView는 기본적으로 트리 항목을 확장하거나 축소하는 기능을 제공합니다. 사용자가 각 항목을 클릭하면 해당 항목의 하위 항목을 확장하거나 축소할 수 있으며, 프로그램적으로도 이러한 동작을 제어할 수 있습니다. 이러한 메서드를 사용하면 프로그램이 실행될 때 자동으로 트리의 모든 항목을 확장하거나 축소할 수 있습니다.

# 특정 항목을 확장
self.tree_view.expandAll()

# 특정 항목을 축소
self.tree_view.collapseAll()

4. QTreeView에서 데이터 편집 및 드래그 앤 드롭 지원

QTreeView는 데이터 편집과 드래그 앤 드롭을 기본적으로 지원합니다. 사용자는 트리 항목의 텍스트를 직접 수정하거나 항목을 드래그하여 다른 위치로 이동할 수 있습니다. 이를 위해서는 QTreeView의 **setEditTriggers()**와 setDragDropMode() 메서드를 사용하여 기능을 활성화할 수 있습니다. 이 코드에서는 사용자가 더블 클릭하여 트리 항목을 편집할 수 있게 하고, 트리 항목을 드래그하여 이동할 수 있도록 설정했습니다.

# 데이터 편집 활성화
self.tree_view.setEditTriggers(QTreeView.DoubleClicked)

# 드래그 앤 드롭 활성화
self.tree_view.setDragDropMode(QTreeView.InternalMove)

트리 항목의 커스터마이징

QTreeView에서 표시되는 트리 항목은 QStandardItem을 사용하여 자유롭게 커스터마이징할 수 있습니다. 예를 들어, 텍스트 외에도 아이콘, 체크박스 등을 추가하여 항목의 표현 방식을 다양하게 만들 수 있습니다. 코드는 트리 항목에 아이콘을 추가하고, 체크박스를 표시하는 방법을 보여줍니다.

# 아이콘과 체크박스를 가진 항목 추가
item_with_icon = QStandardItem('Item with Icon')
item_with_icon.setIcon(QIcon('path/to/icon.png'))
item_with_icon.setCheckable(True)

self.model.appendRow([item_with_icon, QStandardItem('Description')])
반응형

QTreeView에서 사용할 수 있는 주요 이벤트 처리 방법

1. 항목 변경 이벤트 (onItemChanged)

QTreeView에서 onItemChanged 이벤트는 트리 항목의 데이터가 변경되었을 때 발생합니다. 이를 통해 항목의 텍스트나 상태가 변경될 때 특정 동작을 수행할 수 있습니다. onItemChanged 이벤트는 QStandardItemModelitemChanged 시그널을 통해 처리됩니다. 아래 코드는 항목의 텍스트가 변경될 때 호출되는 함수입니다. 사용자가 트리 항목을 편집하면 itemChanged 시그널이 발생하고, 해당 시그널에 연결된 슬롯이 호출됩니다.

# 항목 변경 이벤트 연결
self.model.itemChanged.connect(self.on_item_changed)

def on_item_changed(self, item):
    print(f"Item changed: {item.text()}")

2. 트리 뷰 클릭 이벤트 (clickedTreeView)

트리 뷰 항목을 클릭했을 때 발생하는 clicked 시그널을 통해 특정 항목이 클릭되었을 때 동작을 처리할 수 있습니다. 이 이벤트는 사용자가 트리 항목을 클릭할 때마다 발생하며, 주로 항목의 선택 상태나 상세 정보를 업데이트하는 데 사용됩니다.

# 트리 뷰 클릭 이벤트 연결
self.tree_view.clicked.connect(self.clicked_tree_view)

def clicked_tree_view(self, index):
    item = self.model.itemFromIndex(index)
    print(f"Clicked on: {item.text()}")

3. 항목 더블 클릭 이벤트 처리

더블 클릭 이벤트는 doubleClicked 시그널을 통해 처리할 수 있습니다. 이를 활용하면 특정 항목을 더블 클릭했을 때 발생하는 동작을 제어할 수 있습니다.

# 항목 더블 클릭 시그널 연결
self.tree_view.doubleClicked.connect(self.on_item_double_clicked)

def on_item_double_clicked(self, index):
    item = self.model.itemFromIndex(index)
    print(f"Double-clicked on: {item.text()}")

4. 항목 선택 변경 이벤트 처리

트리 항목이 선택될 때 발생하는 이벤트는 selectionChanged 시그널을 통해 처리할 수 있습니다. 선택된 항목이 변경되었을 때 특정 동작을 수행할 수 있습니다.

# 선택 모델 설정 및 선택 변경 시그널 연결
self.selection_model = self.tree_view.selectionModel()
self.selection_model.selectionChanged.connect(self.on_selection_changed)

def on_selection_changed(self, selected, deselected):
    indexes = selected.indexes()
    for index in indexes:
        item = self.model.itemFromIndex(index)
        print(f"Selected item: {item.text()}")

5. 항목 확장/축소 이벤트 처리

QTreeView에서 항목이 확장되거나 축소될 때 발생하는 이벤트는 expandedcollapsed 시그널을 통해 처리할 수 있습니다.

# 항목 확장/축소 시그널 연결
self.tree_view.expanded.connect(self.on_item_expanded)
self.tree_view.collapsed.connect(self.on_item_collapsed)

def on_item_expanded(self, index):
    item = self.model.itemFromIndex(index)
    print(f"Expanded: {item.text()}")

def on_item_collapsed(self, index):
    item = self.model.itemFromIndex(index)
    print(f"Collapsed: {item.text()}")
반응형