PyQt개발강좌, QTreeWidget과 QTreeWidgetItem으로 아이템 다루기

이번 강좌에서는 PyQt5의 QTreeWidgetQTreeWidgetItem을 사용하여 계층 구조의 아이템을 다루는 방법에 대해 알아보겠습니다. QTreeWidget은 복잡한 데이터 구조를 손쉽게 표현할 수 있는 강력한 위젯입니다. 우리는 이 위젯을 활용하여 GUI 애플리케이션에서 데이터를 시각적으로 표현할 수 있습니다.

1. QTreeWidget 개요

QTreeWidget은 PyQt5에서 제공하는 위젯 중 하나로, 트리 형태의 데이터를 표시하는 데 사용됩니다. 각 트리 노드는 QTreeWidgetItem 객체로 표현되며, 트리 구조를 사람들에게 시각적으로 이해하기 쉽게 보여주는 데 특화되어 있습니다. 이 위젯은 파일 탐색기, 정보 재구성, 데이터 관리 등 다양한 어플리케이션에서 사용됩니다.

2. QTreeWidget 구성 요소

트리 위젯에서 아이템을 표현하기 위해서는 QTreeWidgetItem 클래스를 사용합니다. 이 클래스는 트리 노드를 만들기 위한 기반 객체입니다. QTreeWidgetQTreeWidgetItem의 관계는 다음과 같습니다.

  • QTreeWidget는 트리 구조를 관리하며, 여러 개의 QTreeWidgetItem을 포함할 수 있습니다.
  • QTreeWidgetItem은 트리 노드를 나타내며, 여러 개의 자식 아이템을 가질 수 있습니다.

3. QTreeWidget 및 QTreeWidgetItem 사용 예제

여기서는 간단한 PyQt5 애플리케이션을 만들고 QTreeWidgetQTreeWidgetItem의 기본적인 사용 방식에 대해 설명합니다.

예제 코드

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTreeWidget, QTreeWidgetItem

class TreeWidgetExample(QMainWindow):
    def __init__(self):
        super().__init__()
        
        self.setWindowTitle("QTreeWidget 예제")
        self.setGeometry(100, 100, 600, 400)

        # QTreeWidget 생성
        self.tree_widget = QTreeWidget(self)
        self.tree_widget.setHeaderLabels(["항목 이름", "설명"])

        # 트리 아이템 생성
        self.populate_tree()

        # QTreeWidget을 메인 윈도우에 추가
        self.setCentralWidget(self.tree_widget)

    def populate_tree(self):
        # 상위 아이템 추가
        parent_item1 = QTreeWidgetItem(self.tree_widget, ["부모 아이템 1", "부모 아이템 1 설명"])
        parent_item2 = QTreeWidgetItem(self.tree_widget, ["부모 아이템 2", "부모 아이템 2 설명"])

        # 자식 아이템 추가
        child_item1 = QTreeWidgetItem(parent_item1, ["자식 아이템 1.1", "자식 아이템 1.1 설명"])
        child_item2 = QTreeWidgetItem(parent_item1, ["자식 아이템 1.2", "자식 아이템 1.2 설명"])
        child_item3 = QTreeWidgetItem(parent_item2, ["자식 아이템 2.1", "자식 아이템 2.1 설명"])

        # '부모 아이템' 확장
        parent_item1.addChild(child_item1)
        parent_item1.addChild(child_item2)
        parent_item2.addChild(child_item3)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = TreeWidgetExample()
    window.show()
    sys.exit(app.exec_())

위 코드는 QTreeWidget을 사용하여 부모 노드와 자식 노드를 구성하는 기본적인 예제입니다. populate_tree 메서드에서 트리 아이템을 생성하고 addChild 메서드를 통해 자식 아이템을 추가합니다.

4. 아이템 선택 및 이벤트 처리

트리 위젯에서 아이템을 선택하면 특정 작업을 수행할 수 있습니다. 예를 들어, 아이템을 클릭했을 때 해당 아이템의 정보를 출력하는 기능을 추가해 보겠습니다.

아이템 선택 이벤트 처리 예제


from PyQt5.QtCore import Qt

class TreeWidgetExample(QMainWindow):
    def __init__(self):
        super().__init__()
        # ... (기존 코드)

        # 아이템 선택 시 슬롯 함수 연결
        self.tree_widget.itemClicked.connect(self.on_item_clicked)

    def on_item_clicked(self, item):
        print(f"선택된 아이템: {item.text(0)}")  # 0은 첫 번째 열

# ... (기존 코드)

위 코드에서 itemClicked 시그널을 통해 아이템 클릭 이벤트를 처리합니다. 선택된 아이템의 텍스트를 출력하는 on_item_clicked 메서드에서 간단한 정보를 확인할 수 있습니다.

5. 아이템 관리

트리 위젯에서 아이템을 관리하는 것은 매우 중요합니다. 아래에서는 아이템 추가, 수정 및 삭제 방법을 살펴보겠습니다.

아이템 추가하기


def add_item(self):
    new_item = QTreeWidgetItem(["새 아이템", "새 아이템 설명"])
    self.tree_widget.addTopLevelItem(new_item)

# 메서드 호출
self.add_item()  # 새로운 아이템 추가

위 코드에서 add_item 메서드는 QTreeWidget에 새로운 최상위 아이템을 추가합니다.

아이템 삭제하기


def delete_item(self):
    selected_items = self.tree_widget.selectedItems()
    if selected_items:
        for item in selected_items:
            index = self.tree_widget.indexOfTopLevelItem(item)
            if index >= 0:
                self.tree_widget.takeTopLevelItem(index)
            else:
                parent = item.parent()
                if parent:
                    parent.removeChild(item)

위의 delete_item 메서드는 현재 선택된 아이템을 삭제하는 기능을 포함하고 있습니다. 최상위 아이템과 자식 아이템 모두를 처리할 수 있습니다.

아이템 수정하기


def edit_item(self, item, new_text):
    item.setText(0, new_text)  # 첫 번째 열의 텍스트 수정

아이템 수정을 위해 setText 메서드를 사용하여 특정 열의 텍스트를 변경합니다.

6. QTreeWidget의 스타일 및 속성 조정

QTreeWidget의 외관 및 동작을 조정하여 사용자에게 더 나은 경험을 제공할 수 있습니다. 다양한 옵션 및 스타일을 지정할 수 있습니다.

헤더 및 라벨 설정


self.tree_widget.setHeaderLabels(["헤더1", "헤더2"])  # 헤더 텍스트 설정
self.tree_widget.setColumnWidth(0, 200)  # 첫 번째 열 너비 조정

위 코드를 사용하여 트리 위젯의 헤더 텍스트와 열 너비를 조정합니다. 이를 통해 UI를 더욱 직관적으로 만들 수 있습니다.

아이템 아이콘 추가하기


from PyQt5.QtGui import QIcon

item = QTreeWidgetItem(["아이콘이 있는 아이템", "설명"])
item.setIcon(0, QIcon("path/to/icon.png"))  # 노드에 아이콘 추가

트리 아이템에 아이콘을 추가하려면 setIcon 메서드를 사용하여 아이템의 특정 열에 아이콘을 설정합니다.

7. 결론

이번 강좌에서는 QTreeWidgetQTreeWidgetItem을 사용하여 아이템을 다루는 기본적인 방법을 배웠습니다. 다양한 트리 구조의 데이터를 표시하고 관리하는 방법에 대해 알아보았습니다. 사용자 인터페이스(UI)의 일관성을 높이고 데이터를 효과적으로 표현하기 위해 QTreeWidget은 매우 유용한 선택입니다. 앞으로 PyQt를 활용하여 더욱 복잡한 GUI 어플리케이션으로 발전할 수 있도록 연습해보십시오.

다음 강좌에서는 PyQt5의 다른 위젯 및 레이아웃 관리에 대해 살펴보겠습니다. 감사합니다!