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_())
녹두장군1님의
글이 좋았다면 응원을 보내주세요!