본문 바로가기

프로그래밍/PyQt5 GUI

24. QGroupBox

QGroupBox는 상단 타이틀과 단축키(shortcut)를 제공하며, 그 안에 다양한 위젯을 나타낼 수 있습니다. (QGroupBox 공식 문서) 참고

QGroupBox 클래스는 제목과 제목의 정렬을 설정하도록 해줍니다. 그룹 박스는 체크 가능하도록 설정할 수 있는데, 그룹 박스의 체크 여부에 따라 그 그룹 박스 안에 있는 위젯들이 사용 여부가 결정됩니다.

공간을 절약하기 위해 flat 속성을 활성화할 수 있는데, 보통 프레임의 왼쪽, 오른쪽, 아래쪽 가장자리가 없게 됩니다.

 

24-1 예제: ex23

import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QGroupBox, QRadioButton, QCheckBox, QPushButton, QMenu,QGridLayout, QVBoxLayout)

class MyApp(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        grid = QGridLayout()
        grid.addWidget(self.createFirstExclusiveGroup(), 0, 0)
        grid.addWidget(self.createSecondExclusiveGroup(), 1, 0)
        grid.addWidget(self.createNonExclusiveGroup(), 0, 1)
        grid.addWidget(self.createPushButtonGroup(), 1, 1)

        self.setLayout(grid)

        self.setWindowTitle('Box Layout')
        self.setGeometry(300, 300, 480, 320)
        self.show()


    def createFirstExclusiveGroup(self):
        groupbox = QGroupBox('Exclusive Radio Buttons')

        radio1 = QRadioButton('Radio1')
        radio2 = QRadioButton('Radio2')
        radio3 = QRadioButton('Radio3')

        vbox = QVBoxLayout()
        vbox.addWidget(radio1)
        vbox.addWidget(radio2)
        vbox.addWidget(radio3)

        groupbox.setLayout(vbox)

        return groupbox

    def createSecondExclusiveGroup(self):
        groupbox = QGroupBox('Exclusive Radio Buttons')
        groupbox.setCheckable(True)
        groupbox.setChecked(False)

        radio1 = QRadioButton('Radio1')
        radio2 = QRadioButton('Radio2')
        radio3 = QRadioButton('Radio3')
        radio1.setChecked(True)

        checkbox = QCheckBox('Independent Checkbox')
        checkbox.setChecked(True)

        vbox = QVBoxLayout()
        vbox.addWidget(radio1)
        vbox.addWidget(radio2)
        vbox.addWidget(radio3)
        vbox.addWidget(checkbox)
        vbox.addStretch(1)

        groupbox.setLayout(vbox)

        return groupbox

    def createNonExclusiveGroup(self):
        groupbox = QGroupBox('Non-Exclusive Checkboxes')
        groupbox.setFlat(True)

        checkbox1 = QCheckBox('Checkbox1')
        checkbox2 = QCheckBox('Checkbox2')
        checkbox2.setChecked(True)
        tristatebox = QCheckBox('Tri-state Button')
        tristatebox.setTristate(True)

        vbox = QVBoxLayout()
        vbox.addWidget(checkbox1)
        vbox.addWidget(checkbox2)
        vbox.addWidget(tristatebox)
        vbox.addStretch(1)
        groupbox.setLayout(vbox)

        return groupbox

    def createPushButtonGroup(self):
        groupbox = QGroupBox('Push Buttons')
        groupbox.setCheckable(True)
        groupbox.setChecked(True)

        pushbutton = QPushButton('Normal Button')
        togglebutton = QPushButton('Toggle Button')
        togglebutton.setCheckable(True)
        togglebutton.setChecked(True)
        flatbutton = QPushButton('Flat Button')
        flatbutton.setFlat(True)
        popupbutton = QPushButton('Popup Button')
        menu = QMenu(self)
        menu.addAction('First Item')
        menu.addAction('Second Item')
        menu.addAction('Third Item')
        menu.addAction('Fourth Item')
        popupbutton.setMenu(menu)

        vbox = QVBoxLayout()
        vbox.addWidget(pushbutton)
        vbox.addWidget(togglebutton)
        vbox.addWidget(flatbutton)
        vbox.addWidget(popupbutton)
        vbox.addStretch(1)

        groupbox.setLayout(vbox)

        return groupbox


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyApp()
    sys.exit(app.exec_())

24-2 설명

grid = QGridLayout()
grid.addWidget(self.createFirstExclusiveGroup(), 0, 0)
grid.addWidget(self.createSecondExclusiveGroup(), 1, 0)
grid.addWidget(self.createNonExclusiveGroup(), 0, 1)
grid.addWidget(self.createPushButtonGroup(), 1, 1)

self.setLayout(grid)

그리드 레이아웃을 이용해서 그룹박스를 배치합니다.

각 메서드를 통해 만들어지는 그룹박스가 addWidget() 을 통해 각 위치로 배치됩니다.

def createFirstExclusiveGroup(self):
groupbox = QGroupBox('Exclusive Radio Buttons')

radio1 = QRadioButton('Radio1')
radio2 = QRadioButton('Radio2')
radio3 = QRadioButton('Radio3')

vbox = QVBoxLayout()
vbox.addWidget(radio1)
vbox.addWidget(radio2)
vbox.addWidget(radio3)

groupbox.setLayout(vbox)

return groupbox
  • createFirstExclusiveGroup() 메서드는 베타적인 라디오버튼을 갖는 그룹박스를 만듭니다.
  • 메서드는 먼저 그룹박스 (groupbox)를 하나 만들고, 버튼을 만든 다음 수직 박스 레이아웃을 통해 배치합니다.
  • 세 개의 라디오버튼을 만들고 수직으로 배치합니다.
  • 마지막으로 수직 박스 레이아웃(vbox)를 그룹 박스의 레이아웃으로 설정합니다.
def createSecondExclusiveGroup(self):
    groupbox = QGroupBox('Exclusive Radio Buttons')
    groupbox.setCheckable(True)
    groupbox.setChecked(False)
  • createSecondExclusiveGroup() 메서드는 세 개의 라디오버튼과 한 개의 체크박스를 갖는 그룹박스를 만듭니다.
  • setCheckable() 메서드를 이용해서 groupbox도 선택 가능하도록 할 수 있습니다.
def createNonExclusiveGroup(self):
    groupbox = QGroupBox('Non-Exclusive Checkboxes')
    groupbox.setFlat(True)
  • createNonExclusiveGroup() 메서드는 베타적이지 않은 체크박스들을 갖는 그룹박스를 만듭니다.
  • setFlat()을 이용해서 그룹박스를 평평하게 보이도록 합니다.
def createPushButtonGroup(self):
    groupbox = QGroupBox('Push Buttons')
    groupbox.setCheckable(True)
    groupbox.setChecked(True)
  • createPushButtonGroup() 메서드는 여러 개의 푸시버튼을 갖는 그룹 박스를 만듭니다.
  • setCheckable()과 setChecked()를 이용해서, 그룹 박스를 선택 가능하게, 그리고 실행했을 때 선택되어 있도록 설정합니다.

24-3 결과

'프로그래밍 > PyQt5 GUI' 카테고리의 다른 글

26. QPixmap  (0) 2021.07.26
25. QTabWidget  (0) 2021.07.26
23. QSplitter  (0) 2021.07.26
22. QSlider & QDial  (0) 2021.07.26
21. QProgressBar  (0) 2021.07.26