안녕하세요! 이번 글에서는 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는 매우 유연하고 강력한 라이브러리이므로, 다양한 기능과 도구를 활용하여 자신만의 애플리케이션을 만들어 보세요!
워드프레스 블로그에 게시할 수 있도록 예제를 정리하여 준비했습니다. 질문이나 추가적인 도움이 필요하신 경우 언제든지 댓글로 남겨 주세요.