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 이벤트는 QStandardItemModel의 itemChanged 시그널을 통해 처리됩니다. 아래 코드는 항목의 텍스트가 변경될 때 호출되는 함수입니다. 사용자가 트리 항목을 편집하면 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에서 항목이 확장되거나 축소될 때 발생하는 이벤트는 expanded 및 collapsed 시그널을 통해 처리할 수 있습니다.
# 항목 확장/축소 시그널 연결
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()}")
'코딩취미 > Python' 카테고리의 다른 글
파이썬 초보자가 알아야 할 딕셔너리 사용법 및 업데이트 요령 (0) | 2024.09.12 |
---|---|
리스트 컴프리헨션 구조와 사용방법: 초보자를 위한 간단한 설명과 예제 (0) | 2024.09.10 |
exec()에서 사용자 입력(악성코드) 동작 방지방 (0) | 2024.09.09 |
eval() 에서 악의적인 코드 실행 방지하기 : 보안 위험 방지 (0) | 2024.09.05 |
파이썬 리스트 객체, 원소 추가하기 : append와 extend 의 기능과 차이점 (0) | 2024.09.04 |