안녕하세요! 이번 글에서는 PyQt를 사용하여 GUI 애플리케이션을 개발하는 데 중요한 요소 중 하나인 QStandardItemModel에 대해 상세히 알아보겠습니다. QStandardItemModel은 데이터를 테이블 형식으로 관리할 수 있도록 도와주는 모델입니다. 특히 리스트나 트리 형태의 데이터를 구조화하여 관리하고, GUI 요소(예: QTreeView, QListView 등)와 쉽게 연동할 수 있습니다.
1. QStandardItemModel 개요
QStandardItemModel은 데이터를 메모리에 저장하며, 여러 가지 형태로 데이터를 표현하는 데 유용합니다. 이 모델은 각각의 데이터를 QStandardItem 객체로 나타내며, 이 객체들은 계층 구조로 구성될 수 있습니다. 이렇게 구성된 데이터는 QTreeView나 QListView와 같은 다양한 뷰 컴포넌트와 연결하여 사용할 수 있습니다.
1.1 주요 특징
- 동적 데이터 추가 및 삭제
- 다양한 데이터 형식과 구조 지원
- 모델-뷰 패턴에 기반하여 효율적인 데이터 관리
- 신속한 데이터 접근과 수정 가능
2. PyQt 설치
PyQt를 사용하기 위해서는 먼저 PyQt5를 설치해야 합니다. 다음은 PyQt5를 설치하는 방법입니다:
pip install PyQt5
3. 실습: QStandardItemModel을 사용한 데이터 추가
이제 실제로 QStandardItemModel을 사용하여 간단한 GUI 애플리케이션을 만들어 보겠습니다. 이 애플리케이션은 사용자가 데이터를 추가할 수 있는 기능을 포함할 것입니다.
3.1 기본 코드 구조
다음은 기본 코드 구조입니다:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QListView, QLineEdit, QLabel
from PyQt5.QtGui import QStandardItemModel, QStandardItem
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# Layout 설정
layout = QVBoxLayout()
# QStandardItemModel 생성
self.model = QStandardItemModel()
# QListView 설정
self.listView = QListView()
self.listView.setModel(self.model)
# QLineEdit 입력 필드 설정
self.inputField = QLineEdit()
# 추가 버튼 설정
self.addButton = QPushButton('추가')
self.addButton.clicked.connect(self.addItem)
# Layout에 위젯 추가
layout.addWidget(QLabel('데이터 추가'))
layout.addWidget(self.inputField)
layout.addWidget(self.addButton)
layout.addWidget(self.listView)
self.setLayout(layout)
self.setWindowTitle('QStandardItemModel 예제')
self.show()
def addItem(self):
# 입력 필드에서 텍스트 얻기
text = self.inputField.text()
if text: # 텍스트가 비어 있지 않으면
item = QStandardItem(text)
self.model.appendRow(item)
self.inputField.clear() # 입력 필드 비우기
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
3.2 코드 설명
- QApplication: PyQt 애플리케이션의 기본 클래스입니다.
- QWidget: 모든 GUI 요소의 기본 클래스입니다.
- QVBoxLayout: 수직 레이아웃을 제공합니다.
- QListView: 리스트 형태로 데이터를 표시하는 뷰입니다.
- QLineEdit: 사용자 입력을 받을 수 있는 텍스트 필드입니다.
- QPushButton: 클릭 가능한 버튼입니다.
- QStandardItemModel: 데이터 모델입니다.
- addItem: 버튼 클릭 시 실행되는 메서드로, 입력 필드의 텍스트를 QStandardItem으로 변환하여 모델에 추가합니다.
3.3 추가 기능
위의 예제는 단순히 리스트에 데이터를 추가하는 기본적인 형태입니다. 추가적으로 다음과 같은 기능을 구현할 수 있습니다:
- 데이터 삭제: 선택한 항목을 삭제하는 기능
- 데이터 수정: 선택한 항목의 내용을 수정하는 기능
- 영구 저장: 추가된 데이터를 파일에 저장하고 읽는 기능
4. 데이터 삭제 기능 추가
데이터를 삭제하는 기능을 추가해봅시다. 다음은 삭제 기능이 추가된 코드입니다:
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
layout = QVBoxLayout()
self.model = QStandardItemModel()
self.listView = QListView()
self.listView.setModel(self.model)
self.inputField = QLineEdit()
self.addButton = QPushButton('추가')
self.addButton.clicked.connect(self.addItem)
self.deleteButton = QPushButton('삭제')
self.deleteButton.clicked.connect(self.deleteItem)
layout.addWidget(QLabel('데이터 추가'))
layout.addWidget(self.inputField)
layout.addWidget(self.addButton)
layout.addWidget(self.deleteButton)
layout.addWidget(self.listView)
self.setLayout(layout)
self.setWindowTitle('QStandardItemModel 예제')
self.show()
def addItem(self):
text = self.inputField.text()
if text:
item = QStandardItem(text)
self.model.appendRow(item)
self.inputField.clear()
def deleteItem(self):
index = self.listView.currentIndex()
if index.isValid():
self.model.removeRow(index.row())
4.1 삭제 기능 설명
삭제 기능은 현재 선택된 리스트 항목을 삭제하는 방식으로 구현되었습니다. currentIndex() 메서드를 사용하여 선택된 항목의 인덱스를 얻고, 해당 행을 모델에서 제거합니다. 이를 통해 리스트에서 데이터를 간단하게 제거할 수 있습니다.
5. 데이터 수정 기능 추가
이제 데이터를 수정하는 기능을 추가해봅시다. 선택한 항목을 수정할 수 있는 입력 필드를 추가하겠습니다:
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
layout = QVBoxLayout()
self.model = QStandardItemModel()
self.listView = QListView()
self.listView.setModel(self.model)
self.inputField = QLineEdit()
self.addButton = QPushButton('추가')
self.addButton.clicked.connect(self.addItem)
self.deleteButton = QPushButton('삭제')
self.deleteButton.clicked.connect(self.deleteItem)
self.editButton = QPushButton('수정')
self.editButton.clicked.connect(self.editItem)
layout.addWidget(QLabel('데이터 추가'))
layout.addWidget(self.inputField)
layout.addWidget(self.addButton)
layout.addWidget(self.deleteButton)
layout.addWidget(self.editButton)
layout.addWidget(self.listView)
self.setLayout(layout)
self.setWindowTitle('QStandardItemModel 예제')
self.show()
def addItem(self):
text = self.inputField.text()
if text:
item = QStandardItem(text)
self.model.appendRow(item)
self.inputField.clear()
def deleteItem(self):
index = self.listView.currentIndex()
if index.isValid():
self.model.removeRow(index.row())
def editItem(self):
index = self.listView.currentIndex()
if index.isValid():
new_text = self.inputField.text()
self.model.item(index.row()).setText(new_text)
5.1 수정 기능 설명
수정 기능은 선택된 항목에 대해 QLineEdit의 내용을 적용하는 방식으로 구현되었습니다. 사용자가 입력 필드에 새로운 텍스트를 입력 후 수정 버튼을 클릭하면, 선택된 항목의 텍스트가 업데이트됩니다.
6. 데이터 영구 저장 기능 추가
추가된 데이터를 파일에 저장하고, 다시 불러오는 기능도 구현할 수 있습니다. 다음은 간단한 파일 저장 및 불러오기 기능을 추가한 예제입니다:
import json
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
layout = QVBoxLayout()
self.model = QStandardItemModel()
self.listView = QListView()
self.listView.setModel(self.model)
self.inputField = QLineEdit()
self.addButton = QPushButton('추가')
self.addButton.clicked.connect(self.addItem)
self.saveButton = QPushButton('저장')
self.saveButton.clicked.connect(self.saveData)
self.loadButton = QPushButton('불러오기')
self.loadButton.clicked.connect(self.loadData)
layout.addWidget(QLabel('데이터 추가'))
layout.addWidget(self.inputField)
layout.addWidget(self.addButton)
layout.addWidget(self.saveButton)
layout.addWidget(self.loadButton)
layout.addWidget(self.listView)
self.setLayout(layout)
self.setWindowTitle('QStandardItemModel 예제')
self.show()
def addItem(self):
text = self.inputField.text()
if text:
item = QStandardItem(text)
self.model.appendRow(item)
self.inputField.clear()
def saveData(self):
data = [self.model.item(i).text() for i in range(self.model.rowCount())]
with open('data.json', 'w') as f:
json.dump(data, f)
def loadData(self):
try:
with open('data.json', 'r') as f:
data = json.load(f)
self.model.clear()
for item in data:
self.model.appendRow(QStandardItem(item))
except FileNotFoundError:
pass
6.1 데이터 저장 및 불러오기 설명
위의 예제에서 saveData 메서드는 모델의 데이터를 JSON 형식으로 파일에 저장하고, loadData 메서드는 파일에서 데이터를 읽어 모델에 추가합니다. 이를 통해 애플리케이션의 상태를 유지할 수 있습니다.
7. 마무리
이번 강좌에서는 QStandardItemModel을 사용한 데이터 추가, 삭제, 수정 및 영구 저장 기능을 가진 간단한 PyQt 애플리케이션을 구현해보았습니다. QStandardItemModel은 데이터를 구조화하여 관리할 수 있게 해주는 강력한 도구입니다. 이를 통해 더욱 복잡하고 풍부한 GUI 애플리케이션을 개발할 수 있습니다.
이 강좌에서 배운 내용을 바탕으로 다양한 프로젝트를 진행해보시기 바랍니다. PyQt는 매우 유연하고 강력한 라이브러리이므로, 다양한 기능과 도구를 활용하여 자신만의 애플리케이션을 만들어 보세요!
워드프레스 블로그에 게시할 수 있도록 예제를 정리하여 준비했습니다. 질문이나 추가적인 도움이 필요하신 경우 언제든지 댓글로 남겨 주세요.