QCheckBox 는 선택과 취소, 켜기와 끄기를 전환할 때 사용하는 옵션 컨트롤입니다. QRadioBox 와는 달리 여러 개를 동시에 선택할 수 있습니다. 하지만 PyQt5 에서는 QCheckBox 도 QButtonGroup 을 사용하면 QRadioBox 처럼 컨트롤 그룹 안에서 하나만 선택이 가능하도록 만들 수 있습니다.
▼ QCheckBox 의 체크여부를 표시할 QLabel 객체를 생성합니다.
from PyQt5.QtWidgets import QLabel
# QLabel 에서 선택한 값 표시
self.label = QLabel(self)
self.label.setGeometry(10, 10, 150, 30)
self.label.setStyleSheet('background-color : #FFFFFF')
▼ QCheckBox 객체를 2개 만듭니다. QCheckBox 에서 컨트롤 박스를 체크하고 해제하는 시그널은 stateChanged 입니다. stateChanged 에 체크 여부를 판단할 수 있는 connect() 함수로 연결합니다.
from PyQt5.QtWidgets import QCheckBox
# QCheckBox1 위젯 생성
self.checkbox1 = QCheckBox('Check3 Button', self)
self.checkbox1.stateChanged.connect(self.check_select)
# QCheckBox2 위젯 생성
self.checkbox2 = QCheckBox('Check3 Button', self)
self.checkbox2.stateChanged.connect(self.check_select)
▼ QCheckBox 의 stateChanged 시그널에 연결한 함수는 check_select() 함수 하나입니다. 함수에서는 파라미터로 넘어온 state 상태값을 통해 체크 여부를 확인합니다.
# QCheckBox 선택 이벤트
def check_select(self, state):
if state == Qt.Checked:
self.label.setText('Checked')
else:
self.label.setText('UnChecked')
▼ 다음은 2개의 QCheckBox 를 영역을 구분 짓기 위해 Group Box 로 묶어 보겠습니다. 먼저 QGroupBox 로 묶기 위해서는 QBoxLayout 객체가 필요합니다. 왜냐하면 QGroupBox 는 QBoxLayout 를 필요로 하기 때문입니다. 순서는 다음과 같습니다. QBoxLayout 에 두 개의 QCheckBox 위젯을 추가하고, QBoxLayout 를 QGroupBox 에 추가합니다. 먼저 QBoxLayout에 두 개의 QCheckBox 객체를 추가합니다.
from PyQt5.QtWidgets import QBoxLayout
self.boxlayout = QBoxLayout(QBoxLayout.TopToBottom, parent=self)
self.boxlayout.addWidget(self.checkbox1)
self.boxlayout.addWidget(self.checkbox2)
▼ 다음은 2개의 QCheckBox 가 들어 있는 QBoxLayout 객체를 QGroupBox 의 setLayout() 함수를 이용해서 추가합니다.
from PyQt5.QtWidgets import QGroupBox
# QGroupBox 생성
self.groupbox = QGroupBox('Group Box', self)
self.groupbox.setLayout(self.boxlayout)
self.groupbox.setGeometry(10, 60, 300, 150)
▼ 지금까지 설명한 내용을 구현한 전체 소스는 다음과 같습니다.
#!/usr/bin/env python3
import sys
from PyQt5.QtWidgets import QLabel, QBoxLayout, \
QMainWindow, QApplication, QGroupBox, QCheckBox
from PyQt5.QtCore import pyqtSlot, Qt
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# 윈도우 설정
self.setGeometry(300, 300, 500, 300) # x, y, w, h
self.setWindowTitle('Status Window')
# QLabel 에서 선택한 값 표시
self.label = QLabel(self)
self.label.setGeometry(10, 10, 150, 30)
self.label.setStyleSheet('background-color : #FFFFFF')
# ----- QBoxLayout CheckBox 그룹 객체 생성 -----
# QCheckBox1 위젯 생성
self.checkbox1 = QCheckBox('Check3 Button', self)
self.checkbox1.stateChanged.connect(self.check_select)
# QCheckBox2 위젯 생성
self.checkbox2 = QCheckBox('Check3 Button', self)
self.checkbox2.stateChanged.connect(self.check_select)
self.boxlayout = QBoxLayout(QBoxLayout.TopToBottom, parent=self)
self.boxlayout.addWidget(self.checkbox1)
self.boxlayout.addWidget(self.checkbox2)
# QGroupBox 생성
self.groupbox = QGroupBox('Group Box', self)
self.groupbox.setLayout(self.boxlayout)
self.groupbox.setGeometry(10, 60, 300, 150)
# QCheckBox 선택 이벤트
def check_select(self, state):
if state == Qt.Checked:
self.label.setText('Checked')
else:
self.label.setText('UnChecked')
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())
▼ 서두에도 언급했듯이 CheckBox 라고 해서 다중 선택만 되는 것은 아닙니다. QButtonGroup 객체를 이용해서QCheckBox 를 묶으면 두 컨트롤 중에서 하나만 선택할 수 있습니다. 나머지 선택된 컨트롤의 체크는 해제가 되는 것입니다. QRadioBox 와 동일하게 움직이는 것입니다. 단, QButtonGroup 에서 제공하는 setExclusive() 함수에 True 를 넘겨야 합니다. False 를 넘기면 위젯의 연결은 해제됩니다. 아래 소스에서는 addButton() 함수를 이용해서 두 개의 QCheckBox 를 추가하고 setExclusive() 함수를 True 로 세팅했습니다. 그리고 마지막에 QButtonGroup 의 buttonClicked 시그널에 check_buttongroup() 함수를 연결했습니다. 이전에 QCheckBox 의 연결함수는 모두 무시됩니다.
from PyQt5.QtWidgets import QButtonGroup
self.buttongroup = QButtonGroup(self)
self.buttongroup.setExclusive(True)
self.buttongroup.addButton(self.checkbox1, 1)
self.buttongroup.addButton(self.checkbox2, 2)
self.buttongroup.buttonClicked.connect(self.check_buttongroup)
▼ QButtonGroup 을 추가한 전체 소스는 다음과 같습니다.
#!/usr/bin/env python3
import sys
from PyQt5.QtWidgets import QLabel, QBoxLayout, \
QMainWindow, QApplication, QGroupBox, QCheckBox, QButtonGroup
from PyQt5.QtCore import pyqtSlot, Qt
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# 윈도우 설정
self.setGeometry(300, 300, 500, 300) # x, y, w, h
self.setWindowTitle('Status Window')
# QLabel 에서 선택한 값 표시
self.label = QLabel(self)
self.label.setGeometry(10, 10, 150, 30)
self.label.setStyleSheet('background-color : #FFFFFF')
# ----- QBoxLayout CheckBox 그룹 객체 생성 -----
# QCheckBox1 위젯 생성
self.checkbox1 = QCheckBox('Check3 Button', self)
self.checkbox1.stateChanged.connect(self.check_select)
# QCheckBox2 위젯 생성
self.checkbox2 = QCheckBox('Check3 Button', self)
self.checkbox2.stateChanged.connect(self.check_select)
self.boxlayout = QBoxLayout(QBoxLayout.TopToBottom, parent=self)
self.boxlayout.addWidget(self.checkbox1)
self.boxlayout.addWidget(self.checkbox2)
# QGroupBox 생성
self.groupbox = QGroupBox('Group Box', self)
self.groupbox.setLayout(self.boxlayout)
self.groupbox.setGeometry(10, 60, 300, 150)
self.buttongroup = QButtonGroup(self)
self.buttongroup.setExclusive(True)
self.buttongroup.addButton(self.checkbox1, 1)
self.buttongroup.addButton(self.checkbox2, 2)
self.buttongroup.buttonClicked.connect(self.check_buttongroup)
# QButtonGroup 으로 묶는 경우
def check_buttongroup(self):
print('call buttongroup function')
# QCheckBox 선택 이벤트
def check_select(self, state):
if state == Qt.Checked:
self.label.setText('Checked')
else:
self.label.setText('UnChecked')
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())