PyQt개발강좌, QStandardItemModel을 사용한 데이터 추가

안녕하세요! 이번 글에서는 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는 매우 유연하고 강력한 라이브러리이므로, 다양한 기능과 도구를 활용하여 자신만의 애플리케이션을 만들어 보세요!

워드프레스 블로그에 게시할 수 있도록 예제를 정리하여 준비했습니다. 질문이나 추가적인 도움이 필요하신 경우 언제든지 댓글로 남겨 주세요.