QTableWidget과 체크박스의 필요성
PySide6를 이용한 GUI 애플리케이션 개발에서
테이블은 데이터를 효과적으로 표시하는 중요한 위젯입니다.
특히 사용자가 테이블에서 여러 행을 선택하고 관리해야 할 때,
체크박스는 매우 유용한 UI 요소입니다.
QTableWidget에 체크박스를 추가하면
사용자가 직관적으로 여러 항목을 선택하고 일괄 처리할 수 있습니다.
이 포스팅에서는 PySide6의 QTableWidget에
체크박스를 추가하는 방법과 이벤트 처리 방법을 자세히 알아보겠습니다.
테이블 위젯 기본 설정하기
체크박스를 추가하기 전에 먼저 QTableWidget의 기본 설정을 살펴보겠습니다.
테이블 위젯을 생성하고 열과 행을 설정하는 과정이 필요합니다.
체크박스를 위한 별도의 열을 추가해야 하므로 열 개수를 계획할 때 이를 고려해야 합니다.
테이블 기본 구조 설정
다음 코드는 테이블 위젯의 기본 구조를 설정하는 방법을 보여줍니다:
# 테이블 설정 (체크박스 열 추가로 총 6개 열)
self.ui.tableWidget.setColumnCount(6) # 6개 열 생성 (체크박스 + 기존 5개)
self.ui.tableWidget.setRowCount(20) # 20개 행 생성
# 열 헤더 설정
headers = ["선택", "이름", "나이", "성별", "직업", "점수"]
self.ui.tableWidget.setHorizontalHeaderLabels(headers)
여기서 중요한 점은 체크박스를 위한 첫 번째 열을 "선택"이라는 헤더로 지정했다는 것입니다.
이렇게 하면 사용자에게 해당 열이 선택을 위한 것임을 명확히 알릴 수 있습니다.
테이블에 체크박스 열 추가하기
이제 테이블에 체크박스를 추가하는 핵심 부분을 살펴보겠습니다.
PySide6에서는 QTableWidgetItem의 체크 상태를 설정하여 체크박스 기능을 구현합니다.
체크박스 아이템 생성
다음은 테이블의 첫 번째 열에 체크박스를 추가하는 코드입니다:
# 테이블에 데이터 입력
for row in range(20):
# 체크박스 추가
checkbox_item = QTableWidgetItem()
checkbox_item.setCheckState(Qt.Unchecked)
self.ui.tableWidget.setItem(row, 0, checkbox_item)
# 이름
name_item = QTableWidgetItem(names[row])
self.ui.tableWidget.setItem(row, 1, name_item)
# 나머지 데이터 입력...
1. QTableWidgetItem 객체를 생성합니다.
2. setCheckState() 메서드를 사용하여 초기 체크 상태를 설정합니다.
3. Qt.Unchecked 또는 Qt.Checked 값을 사용하여 체크 상태를 지정합니다.
4. 테이블의 첫 번째 열(인덱스 0)에 체크박스 아이템을 설정합니다.
이 방식으로 테이블의 각 행에 체크박스를 추가할 수 있습니다.
기본적으로 모든 체크박스는 체크되지 않은 상태(Qt.Unchecked)로 시작합니다.
필요에 따라 특정 행의 체크박스를 미리 체크된 상태(Qt.Checked)로 설정할 수도 있습니다.
체크박스 이벤트 처리하기
체크박스를 추가한 후에는 사용자가 체크박스를 클릭했을 때 이벤트를 처리해야 합니다.
이를 위해 itemChanged 시그널을 연결하고 체크박스 상태 변경을 감지하는 슬롯을 구현합니다.
이벤트 연결
먼저 테이블의 itemChanged 시그널을 슬롯에 연결합니다:
# 셀 변경 이벤트 연결
self.ui.tableWidget.itemChanged.connect(self.on_item_changed)
체크박스 상태 변경 처리
다음은 체크박스 상태 변경을 처리하는 슬롯 메서드입니다:
@Slot(QTableWidgetItem)
def on_item_changed(self, item):
# 체크박스 열(0번 열)의 아이템이 변경되었을 때만 처리
if item.column() == 0:
row = item.row()
# 체크박스가 체크되었는지 확인
if item.checkState() == Qt.Checked:
# 해당 행 선택
self.ui.tableWidget.selectRow(row)
else:
# 체크 해제되면 해당 행 선택 해제
# 현재 선택된 범위 가져오기
selection_ranges = self.ui.tableWidget.selectedRanges()
# 선택 해제
self.ui.tableWidget.clearSelection()
# 다른 체크된 행들은 다시 선택
for r in range(self.ui.tableWidget.rowCount()):
if r != row and self.ui.tableWidget.item(r, 0).checkState() == Qt.Checked:
self.ui.tableWidget.selectRow(r)
이 슬롯 메서드는 다음과 같은 작업을 수행합니다:
1. 변경된 아이템이 체크박스 열(0번 열)인지 확인합니다.
2. 체크박스가 체크되면 해당 행을 선택합니다.
3. 체크박스가 해제되면 해당 행의 선택을 해제하고, 다른 체크된 행들은 다시 선택합니다. 이 방식으로 체크박스와 행 선택이 동기화되어 사용자 경험이 향상됩니다.
테이블 최적화 및 스타일링
체크박스가 포함된 테이블을 보기 좋게 표시하기 위해 몇 가지 최적화와 스타일링을 적용할 수 있습니다.
테이블 크기 최적화
체크박스 열의 너비를 내용에 맞게 조절하고, 나머지 열은 테이블 너비에 맞게 자동으로 조절하는 코드입니다:
def setupTableSize(self):
# 체크박스 열은 내용에 맞게 조절
self.ui.tableWidget.horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeToContents)
# 나머지 열들은 Stretch 모드로 설정하여 테이블 너비에 맞게 자동 조절
for i in range(1, self.ui.tableWidget.columnCount()):
self.ui.tableWidget.horizontalHeader().setSectionResizeMode(i, QHeaderView.Stretch)
# 행 높이 자동 조절
self.ui.tableWidget.verticalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
행 선택 모드 설정
사용자가 행 단위로 선택할 수 있도록 설정하는 코드입니다:
# 행 선택 모드 설정 - 행 단위 선택
self.ui.tableWidget.setSelectionBehavior(self.ui.tableWidget.SelectionBehavior.SelectRows)
이렇게 설정하면 사용자가 테이블의 셀을 클릭할 때 해당 행 전체가 선택됩니다.
체크박스와 함께 사용하면 더욱 일관된 사용자 경험을 제공할 수 있습니다.
헤더 체크박스로 모든 행 선택/해제 기능 구현하기
테이블의 헤더에 체크박스를 추가하여
모든 행을 한 번에 선택하거나 해제하는 기능은 매우 유용합니다.
특히 데이터가 많은 테이블에서 일괄 작업을 수행할 때 필수적인 기능입니다.
헤더 체크박스 구현 방법
PySide6에서는 테이블 헤더에 직접 체크박스를 넣는 기능을 제공하지 않기 때문에,
헤더 클릭 이벤트를 활용하여 이 기능을 구현해야 합니다. 다음은 이 기능을 구현하는 코드입니다.
# MainWindow 클래스의 __init__ 메서드 내에 추가
# 헤더 클릭 이벤트 연결
self.ui.tableWidget.horizontalHeader().sectionClicked.connect(self.on_header_clicked)
# 헤더 클릭 상태를 저장할 변수 (True: 모두 선택, False: 모두 해제)
self.header_checked = False
# 헤더 클릭 이벤트 처리 메서드
@Slot(int)
def on_header_clicked(self, section):
# 첫 번째 열(체크박스 열)의 헤더가 클릭되었을 때만 처리
if section == 0:
# 현재 상태의 반대로 설정
self.header_checked = not self.header_checked
# 모든 행의 체크박스 상태 변경
for row in range(self.ui.tableWidget.rowCount()):
item = self.ui.tableWidget.item(row, 0)
if item:
# 체크 상태 설정
item.setCheckState(Qt.Checked if self.header_checked else Qt.Unchecked)
# 선택 상태도 업데이트
if self.header_checked:
self.ui.tableWidget.selectAll()
else:
self.ui.tableWidget.clearSelection()
1. horizontalHeader().sectionClicked 시그널을 사용하여 헤더 클릭 이벤트를 감지합니다.
2. 체크박스 열(0번 열)의 헤더가 클릭되었을 때만 처리합니다.
3. 헤더의 체크 상태를 저장하는 변수를 토글합니다.
4. 모든 행의 체크박스 상태를 현재 헤더 상태에 맞게 변경합니다.
5. 테이블의 선택 상태도 함께 업데이트하여 UI의 일관성을 유지합니다.
헤더 스타일 커스터마이징
헤더 체크박스 기능을 더 명확하게 표시하기 위해, 헤더 스타일을 커스터마이징할 수 있습니다:
# 헤더 스타일 설정
def setup_header_style(self):
# 체크박스 열의 헤더에 특별한 스타일 적용
self.ui.tableWidget.horizontalHeaderItem(0).setToolTip("모든 항목 선택/해제")
self.ui.tableWidget.horizontalHeaderItem(0).setTextAlignment(Qt.AlignCenter)
# 선택적으로 QSS 스타일을 적용할 수도 있습니다
self.ui.tableWidget.horizontalHeader().setStyleSheet("""
QHeaderView::section:first {
background-color: #e6f2ff;
border: 1px solid #99ccff;
}
""")
이 코드는 체크박스 열의 헤더에 툴팁과 특별한 스타일을 적용하여
사용자에게 해당 헤더가 클릭 가능하다는 것을 시각적으로 알려줍니다.
헤더 체크박스 상태 표시 개선
사용자 경험을 더욱 향상시키기 위해,
현재 체크된 행의 수에 따라 헤더의 텍스트를 동적으로 변경할 수 있습니다:
# 체크된 행 수에 따라 헤더 텍스트 업데이트
def update_header_text(self):
checked_count = 0
total_count = self.ui.tableWidget.rowCount()
# 체크된 행 수 계산
for row in range(total_count):
item = self.ui.tableWidget.item(row, 0)
if item and item.checkState() == Qt.Checked:
checked_count += 1
# 헤더 텍스트 업데이트
if checked_count == 0:
header_text = "선택"
elif checked_count == total_count:
header_text = "선택(전체)"
else:
header_text = f"선택({checked_count}/{total_count})"
self.ui.tableWidget.horizontalHeaderItem(0).setText(header_text)
# on_item_changed 메서드 끝에 추가
self.update_header_text()
# on_header_clicked 메서드 끝에 추가
self.update_header_text()
이 코드는 체크된 행의 수를 계산하고,
그에 따라 헤더의 텍스트를 "선택", "선택(전체)" 또는 "선택(X/Y)"와 같은 형식으로 업데이트합니다.
이를 통해 사용자는 현재 몇 개의 항목이 선택되었는지 한눈에 확인할 수 있습니다.
1. 대용량 데이터에서 특히 유용하므로 성능 최적화에 신경쓰세요.
2. 체크박스 상태 변경 시 발생하는 이벤트 루프를 고려하여 불필요한 처리를 방지하세요.
3. 부분 선택 상태(일부만 선택된 상태)를 시각적으로 표현하는 것도 고려해보세요.
4. 선택된 항목에 대한 일괄 작업 버튼을 UI에 추가하면 사용성이 향상됩니다.
5. 선택 상태를 저장하고 복원하는 기능을 구현하면 사용자 경험이 개선됩니다.
이 추가 기능을 통해 사용자는 테이블의 모든 행을 쉽게 선택하거나 해제할 수 있으며,
대량의 데이터를 효율적으로 관리할 수 있습니다.
헤더 체크박스는 특히 일괄 처리 작업이 필요한 비즈니스 애플리케이션에서 필수적인 UI 요소입니다.
마무리 및 활용 팁
PySide6의 QTableWidget에 체크박스를 추가하는 방법을 살펴보았습니다.
체크박스는 사용자가 테이블에서 여러 항목을 선택하고 관리하는 데 매우 유용한 UI 요소입니다.
1. 체크된 행에 대한 일괄 작업 기능 구현하기
2. 모든 행을 선택/해제하는 헤더 체크박스 추가하기
3. 체크박스 상태를 저장하고 불러오는 기능 구현하기
4. 체크된 행의 데이터만 필터링하여 표시하는 기능 추가하기
5. 체크박스 상태에 따라 행의 배경색을 다르게 표시하기
이 포스팅에서 설명한 방법을 활용하면 PySide6 애플리케이션에서
사용자 친화적인 테이블 인터페이스를 구현할 수 있습니다.
체크박스를 통해 사용자는 직관적으로 여러 항목을 선택하고 관리할 수 있으며,
개발자는 선택된 항목에 대한 다양한 기능을 구현할 수 있습니다.
테이블에 체크박스를 추가하는 것은 간단해 보이지만, 사용자 경험을 크게 향상시키는 중요한 UI 요소입니다.
이 가이드를 통해 여러분의 PySide6 애플리케이션 개발에 도움이 되길 바랍니다.
[ 파이썬 관련 블로그 글 목록 ]
파이썬(Python) 블로그 목록
'PYTHON GUI' 카테고리의 다른 글
[ Pyside6 ] QStandardItemModel로 데이터 테이블 쉽게 만들기 (0) | 2025.05.26 |
---|---|
[ PySide6 ] QTableWidget 열 너비 자동 조절 후 마우스로 수동 조절하는 방법 (0) | 2025.05.24 |
[ PySide6 ] QTableWidget 메서드 기본 가이드: 테이블 위젯 기본기 익히기 (2) | 2025.05.21 |
[ PySide6 ] QLineEdit 완벽 가이드 (2부) - 시각적 속성과 이벤트 처리 (0) | 2025.05.18 |
[ PySide6 ] QLineEdit 완벽 가이드 (1부) - 텍스트 관리와 입력 제어 (0) | 2025.05.18 |