Please Enable JavaScript!
Gon[ Enable JavaScript ]

파이썬(Python) PyQt5 QCheckBox 사용하기

카테고리 없음
반응형

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_())

 

반응형
Posted by 녹두장군1
,