PyQt개발강좌, QListView 및 QTableView 기본 사용법

PyQt는 Python에서 Qt 프레임워크를 사용할 수 있게 해주는 바인딩입니다. GUI 애플리케이션을 쉽게 개발할 수 있도록 다양한 위젯과 툴킷을 제공하며, 그 중에서도 QListViewQTableView는 데이터 뷰를 표시하는데 많이 사용되는 위젯입니다. 이 글에서는 두 위젯의 기본 사용법에 대해 자세히 살펴보겠습니다.

1. PyQt 환경 설정

PyQt를 사용하기 위해선 먼저 PyQt5를 설치해야 합니다. 이를 위해 pip를 사용하여 설치할 수 있습니다. 아래의 명령어를 터미널에 입력하세요:

pip install PyQt5

2. QListView 개요

QListView는 목록 형태로 데이터를 보여주는 뷰입니다. 사용자가 스크롤할 수 있는 리스트로 데이터를 표시하며, 주로 아이템을 선택하거나 선택된 아이템에 대한 정보를 표시하는 데 사용됩니다. QListView는 모델-뷰-컨트롤러(MVC) 아키텍처를 따릅니다. 즉, 데이터는 모델에서 관리되며, 뷰는 이 데이터를 표시하는 역할을 합니다.

2.1 QListView 생성 예제

다음은 QListView를 사용하는 기본적인 예제입니다.

from PyQt5.QtWidgets import QApplication, QListView, QStringListModel
import sys

app = QApplication(sys.argv)

# QListView 초기화
listView = QListView()

# 문자열 리스트 모델 생성
model = QStringListModel()
data = ["아이템 1", "아이템 2", "아이템 3", "아이템 4"]
model.setStringList(data)

# 모델을 QListView에 설정
listView.setModel(model)

# QListView 보여주기
listView.show()

sys.exit(app.exec_())

3. QTableView 개요

QTableView는 테이블 형태로 데이터를 표시하는 위젯입니다. 행과 열로 구성되어 있어 복잡한 데이터를 쉽게 정렬 및 분석할 수 있습니다. QListView와 마찬가지로 QTableView도 모델-뷰-컨트롤러(MVC) 아키텍처를 따릅니다. 데이터 소스는 모델에서 제공되며, 뷰는 이 데이터를 사용자에게 보여줍니다.

3.1 QTableView 생성 예제

다음은 QTableView를 사용하는 기본적인 예제입니다. 여기서는 2차원 데이터 구조를 생성하여 QTableView에 표시합니다.

from PyQt5.QtWidgets import QApplication, QTableView
from PyQt5.QtCore import QAbstractTableModel, Qt
import sys

# 테이블 모델 클래스 정의
class MyTableModel(QAbstractTableModel):
    def __init__(self, data):
        super(MyTableModel, self).__init__()
        self._data = data

    def rowCount(self, parent=None):
        return len(self._data)

    def columnCount(self, parent=None):
        return len(self._data[0]) if self._data else 0

    def data(self, index, role=Qt.DisplayRole):
        if role == Qt.DisplayRole:
            return self._data[index.row()][index.column()]

# 애플리케이션 초기화
app = QApplication(sys.argv)

# QTableView 초기화
tableView = QTableView()

# 데이터 생성
data = [
    ["이름", "나이", "직업"],
    ["Alice", 30, "개발자"],
    ["Bob", 25, "디자이너"],
    ["Charlie", 35, "매니저"]
]

# 테이블 모델 생성
model = MyTableModel(data)

# 모델을 QTableView에 설정
tableView.setModel(model)

# QTableView 보여주기
tableView.show()

sys.exit(app.exec_())

4. QListView와 QTableView의 비교

QListView와 QTableView는 모두 데이터를 표시하는 강력한 위젯이지만, 사용 사례에 따라 다릅니다. QListView는 단일 차원 데이터를 시각화하고, QTableView는 다차원 데이터를 제공하는 데 적합합니다. 따라서 데이터의 특성과 대상 사용자에게 맞춰 적절한 위젯을 선택해야 합니다.

5. 데이터 모델링

QListView 및 QTableView를 효과적으로 사용하기 위해서는 데이터를 어떻게 모델링할지를 고려해야 합니다. PyQt는 다양한 모델을 제공하여 데이터베이스, XML, JSON 등의 데이터 소스를 쉽게 연동할 수 있습니다. 데이터 모델링에서 가장 일반적으로 사용되는 모델로는 QStringListModel (QListView용), QAbstractTableModel (QTableView용) 등이 있습니다.

6. 시그널과 슬롯

PyQt의 강력한 기능 중 하나는 시그널과 슬롯입니다. UI의 반응성을 높이고 사용자 상호작용을 처리하기 위해 시그널과 슬롯을 활용할 수 있습니다. 예를 들어, QListView에서 아이템을 선택하면 해당 아이템의 세부 정보를 표시하는 슬롯을 연결할 수 있습니다.

6.1 QListView의 시그널 연결 예제

아래 예제는 QListView에서 아이템 선택 시 해당 아이템을 출력하는 방법을 보여줍니다.

from PyQt5.QtWidgets import QApplication, QListView, QMessageBox, QStringListModel
from PyQt5.QtCore import QModelIndex
import sys

def on_item_selected(index: QModelIndex):
    if index.isValid():
        item = model.data(index)
        QMessageBox.information(None, "선택된 아이템", f"선택된 아이템은: {item}")

app = QApplication(sys.argv)

# QListView 초기화
listView = QListView()

# 문자열 리스트 모델 생성
model = QStringListModel()
data = ["아이템 1", "아이템 2", "아이템 3", "아이템 4"]
model.setStringList(data)

# 모델을 QListView에 설정
listView.setModel(model)

# 아이템 선택 시 시그널 연결
listView.clicked.connect(on_item_selected)

# QListView 보여주기
listView.show()

sys.exit(app.exec_())

7. 데이터 업데이트

QListView와 QTableView는 동적으로 데이터를 업데이트할 수 있습니다. 모델의 데이터를 변경하면 뷰가 자동으로 업데이트됩니다. 이는 사용자 인터페이스의 실시간 피드백을 제공하고 UI가 항상 최신 상태를 유지하도록 합니다.

7.1 데이터 업데이트 예제

아래 예제에서는 QTableView의 데이터를 실시간으로 업데이트하는 방법을 설명합니다.

from PyQt5.QtWidgets import QApplication, QTableView, QPushButton, QVBoxLayout, QWidget
from PyQt5.QtCore import Qt, QAbstractTableModel
import sys

class DataModel(QAbstractTableModel):
    def __init__(self, data):
        super(DataModel, self).__init__()
        self._data = data

    def rowCount(self, parent=None):
        return len(self._data)

    def columnCount(self, parent=None):
        return len(self._data[0]) if self._data else 0

    def data(self, index, role=Qt.DisplayRole):
        if role == Qt.DisplayRole:
            return self._data[index.row()][index.column()]

    def update_data(self, new_data):
        self._data = new_data
        self.layoutChanged.emit()

# 애플리케이션 초기화
app = QApplication(sys.argv)

# QTableView 초기화
tableView = QTableView()

# 데이터 생성
data = [
    ["이름", "나이", "직업"],
    ["Alice", 30, "개발자"],
    ["Bob", 25, "디자이너"],
    ["Charlie", 35, "매니저"]
]

# 테이블 모델 생성
model = DataModel(data)

# 모델을 QTableView에 설정
tableView.setModel(model)

# 데이터 업데이트 버튼
button = QPushButton("데이터 업데이트")
def update_table():
    new_data = [
        ["이름", "나이", "직업"],
        ["Dave", 28, "마케터"],
        ["Eve", 22, "트레이너"],
        ["Frank", 40, "리더"]
    ]
    model.update_data(new_data)

button.clicked.connect(update_table)

# 레이아웃 설정
layout = QVBoxLayout()
layout.addWidget(tableView)
layout.addWidget(button)

window = QWidget()
window.setLayout(layout)
window.show()

sys.exit(app.exec_())

8. 최적화 및 사용자 경험

QListView와 QTableView를 사용할 때 성능 최적화와 사용자 경험을 고려해야 합니다. 대량의 데이터를 다룰 때는 페이징 기법이나 지연 로딩을 통해 성능을 향상시킬 수 있습니다. 또한, 사용자 친화적인 UI 디자인이 중요합니다. 필터링, 정렬, 검색 기능 등을 추가하여 사용자가 쉽게 데이터를 조작할 수 있도록 하는 것이 좋습니다.

9. 마무리

PyQt에서 QListView와 QTableView는 매우 중요한 기본 위젯입니다. 이 위젯들을 활용하여 다양한 형태의 데이터를 사용자에게 보여줄 수 있으며, 데이터 상호작용의 기회를 제공합니다. 본 강좌를 통해 기본적인 사용법을 익혔으니, 실전에서 다양한 프로젝트에 응용하여 더욱 효과적인 사용자 인터페이스를 구축하길 바랍니다.

이 글이 여러분의 PyQt 개발에 많은 도움이 되었길 바랍니다. 질문이 있으시면 댓글로 남겨주세요!