QRadioButton 여러 개의 선택지 중에 하나를 골라야 하는 경우 사용하는 위젯입니다. QCheckBox 는 다중 선택이 가능하지만 QRadioButton 는 하나만 선택할 수 있습니다. 이것을 흔히 라디오박스라고 합니다. 오늘은 4개의 라디오박스 중 하나를 선택하면 QLabel 에 표시하는 기능을 구현할 것입니다.
▼ 화면에 QRadioButton 선택 여부를 확인할 수 있는 QLabel 객체를 추가합니다. QLabel 에는 어느 QRadioButton 이 체크되었는지 표시합니다.
from PyQt5.QtWidgets import QLabel
# QLabel 에서 선택한 값 표시
self.label = QLabel(self)
self.label.setGeometry(10, 10, 150, 30)
self.label.setStyleSheet('background-color : #FFFFFF')
▼ 다음은 4개의 QRadioButton 객체를 생성합니다. 각 QRadioButton 에는 clicked 시그널에 동작할 함수를 연결하는데, 모두 동일한 self.radio_select() 입니다. 해당 함수에서는 각 QRadioButton 의 체크여부를 확인해서 QLabel 에 어느 QRadioButton 이 선택되었는지 표시합니다.
from PyQt5.QtWidgets import QRadioButton
# QRadioButton1 위젯 생성
self.radio1 = QRadioButton('Radio1 Button', self)
self.radio1.clicked.connect(self.radio_select)
self.radio1.setGeometry(10, 50, 150, 30)
# QRadioButton2
self.radio2 = QRadioButton('Radio2 Button', self)
self.radio2.clicked.connect(self.radio_select)
self.radio2.setGeometry(10, 90, 150, 30)
# QRadioButton3
self.radio3 = QRadioButton('Radio3 Button', self)
self.radio3.clicked.connect(self.radio_select)
self.radio3.setGeometry(10, 130, 150, 30)
# QRadioButton4
self.radio4 = QRadioButton('Radio4 Button', self)
self.radio4.clicked.connect(self.radio_select)
self.radio4.setGeometry(10, 170, 150, 30)
▼ QRadioButton 의 clicked 시그널에 연결된 self.radio_select() 함수의 내용입니다. QRadioButton 의 isChecked() 함수를 사용해서 체크 여부를 확인합니다. 그리고 if ~ elif ~ 조건문을 사용해서 어느 QRadioButton 이 선택되었는지 확인한 후 QLabel 에 표시합니다. QMainWindows 에 추가한 4개의 QRadioButton 는 서로 연결되어 있기 때문에 하나가 선택되면 이전에 선택된 QRadioButton는 자동 해제가 됩니다.
# QRadioButton 선택 이벤트
@pyqtSlot()
def radio_select(self):
# QRadioButton1 클릭 여부 표시
if self.radio1.isChecked():
self.label.setText('Radio1 Check')
elif self.radio2.isChecked():
self.label.setText('Radio2 Check')
elif self.radio3.isChecked():
self.label.setText('Radio3 Check')
elif self.radio4.isChecked():
self.label.setText('Radio4 Check')
▼ 위에서 설명한 내용을 구현한 전체 소스입니다.
#!/usr/bin/env python3
import sys
from PyQt5.QtWidgets import QRadioButton, QLabel, QBoxLayout, \
QPushButton, QMainWindow, QApplication, QGroupBox
from PyQt5.QtCore import pyqtSlot
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')
# QRadioButton1 위젯 생성
self.radio1 = QRadioButton('Radio1 Button', self)
self.radio1.clicked.connect(self.radio_select)
self.radio1.setGeometry(10, 50, 150, 30)
# QRadioButton2
self.radio2 = QRadioButton('Radio2 Button', self)
self.radio2.clicked.connect(self.radio_select)
self.radio2.setGeometry(10, 90, 150, 30)
# QRadioButton3
self.radio3 = QRadioButton('Radio3 Button', self)
self.radio3.clicked.connect(self.radio_select)
self.radio3.setGeometry(10, 130, 150, 30)
# QRadioButton4
self.radio4 = QRadioButton('Radio4 Button', self)
self.radio4.clicked.connect(self.radio_select)
self.radio4.setGeometry(10, 170, 150, 30)
# QRadioButton 선택 이벤트
@pyqtSlot()
def radio_select(self):
# QRadioButton1 클릭 여부 표시
if self.radio1.isChecked():
self.label.setText('Radio1 Check')
elif self.radio2.isChecked():
self.label.setText('Radio2 Check')
elif self.radio3.isChecked():
self.label.setText('Radio3 Check')
elif self.radio4.isChecked():
self.label.setText('Radio4 Check')
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())
▼ 다음은 소스를 수정해서 2개의 그룹으로 나누겠습니다. 4개를 2개씩 두 개의 그룹으로 나눠서 선택 여부를 확인하고 싶다면 어떻게 해야 할까요? 쉽게 말해서 하나의 그룹에서 선택하면 다른 그룹의 QRadioButton 에는 영향을 미치지 않게 하는 것입니다. 그러기 위해서는 QGroupBox 를 사용해서 QRadioButton 위젯을 묶어야 합니다. 그런데 QGroupBox 에는 위젯을 바로 추가할 수 없습니다. Layout 객체를 만들어서 QRadioButton 를 추가한 후 QGroupBox 객체에 Layout 을 추가해야 합니다. Layout 클래스는 다양합니다. QBoxLayout, QVBoxLayout, QHBoxLayout, QGridLayout 등이 있는데, 이중에 하나를 골라서 객체를 생성하고 QRadioButton 위젯을 추가합니다.
1. QRadioButton 객체 생성
2. QBoxLayout Layout 객체 생성
3. QBoxLayout 에 QRadioButton 추가
4. QGroupBox 객체 생성
5. QGroupBox 에 QBoxLayout 추가
▼ 2 ~ 3번 단계를 구현하기 위해 QBoxLayout Layout 을 생성하고 QRadioButton 2 개를 추가합니다.
from PyQt5.QtWidgets import QBoxLayout
self.boxlayout1 = QBoxLayout(QBoxLayout.LeftToRight, parent=self)
self.boxlayout1.addWidget(self.radio1)
self.boxlayout1.addWidget(self.radio2)
▼ 4 ~ 5번 단계에서는 QGroupBox 객체에 2번 단계에서 만든 QBoxLayout 을 추가하고 setGeometry() 함수를 이용해서 화면 내에서의 위치를 지정합니다.
from PyQt5.QtWidgets import QGroupBox
# QGroupBox1 생성
self.groupbox1 = QGroupBox('Group Box 1', self)
self.groupbox1.setLayout(self.boxlayout1)
self.groupbox1.setGeometry(10, 60, 300, 60)
▼ 이제 1 ~ 5번 단계를 한번 더 반복해서 두 번째 Layout 과 QGroupBox 생성하고 화면에 추가합니다.
# ----- QBoxLayout2 객체 생성 -----
self.boxlayout2 = QBoxLayout(QBoxLayout.LeftToRight, parent=self)
self.boxlayout2.addWidget(self.radio3)
self.boxlayout2.addWidget(self.radio4)
# QGroupBox2 생성
self.groupbox2 = QGroupBox('Group Box 1', self)
self.groupbox2.setLayout(self.boxlayout2)
self.groupbox2.setGeometry(10, 130, 300, 60)
▼ QRadioButton 의 선택을 구분하기 위해 두 그룹으로 나누는 작업을 완료했습니다. 그럼 그룹별로 선택에 영향을 주지 않는지 테스트해 보겠습니다. 그림처럼 이전과 달리 그룹에 하나씩 선택이 된 것을 볼 수 있습니다.
▼ 최종 소스는 다음과 같습니다.
#!/usr/bin/env python3
import sys
from PyQt5.QtWidgets import QRadioButton, QLabel, QBoxLayout, \
QMainWindow, QApplication, QGroupBox
from PyQt5.QtCore import pyqtSlot
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')
# QRadioButton1 위젯 생성
self.radio1 = QRadioButton('Radio1 Button')
self.radio1.clicked.connect(self.radio_select)
# QRadioButton2
self.radio2 = QRadioButton('Radio2 Button')
self.radio2.clicked.connect(self.radio_select)
# QRadioButton3
self.radio3 = QRadioButton('Radio3 Button', self)
self.radio3.clicked.connect(self.radio_select)
# QRadioButton4
self.radio4 = QRadioButton('Radio4 Button', self)
self.radio4.clicked.connect(self.radio_select)
# ----- QBoxLayout1 객체 생성 -----
self.boxlayout1 = QBoxLayout(QBoxLayout.LeftToRight, parent=self)
self.boxlayout1.addWidget(self.radio1)
self.boxlayout1.addWidget(self.radio2)
# QGroupBox1 생성
self.groupbox1 = QGroupBox('Group Box 1', self)
self.groupbox1.setLayout(self.boxlayout1)
self.groupbox1.setGeometry(10, 60, 300, 60)
# ----- QBoxLayout2 객체 생성 -----
self.boxlayout2 = QBoxLayout(QBoxLayout.LeftToRight, parent=self)
self.boxlayout2.addWidget(self.radio3)
self.boxlayout2.addWidget(self.radio4)
# QGroupBox2 생성
self.groupbox2 = QGroupBox('Group Box 1', self)
self.groupbox2.setLayout(self.boxlayout2)
self.groupbox2.setGeometry(10, 130, 300, 60)
# QRadioButton 선택 이벤트
@pyqtSlot()
def radio_select(self):
# QRadioButton1 클릭 여부 표시
if self.radio1.isChecked():
self.label.setText('Radio1 Check')
elif self.radio2.isChecked():
self.label.setText('Radio2 Check')
elif self.radio3.isChecked():
self.label.setText('Radio3 Check')
elif self.radio4.isChecked():
self.label.setText('Radio4 Check')
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())
'파이썬 > PyQt5' 카테고리의 다른 글
파이썬(Python) PyQt5 Qt Designer 다운받아 화면 구현하기 (0) | 2021.11.19 |
---|---|
파이썬(Python) PyQt5 QSlider 사용하기 (0) | 2021.11.17 |
파이썬(Python) PyQt5 QPushButton 버튼 사용하기 (1) | 2021.11.16 |
파이썬(Python) PyQt5 QPixmap 으로 화면에 이미지 표시하기 (0) | 2021.11.15 |
파이썬(Python) PyQt5 QListWidget 위젯 사용하기 (2) | 2021.11.13 |