QCheckBox 는 체크박스 위젯이다.

 

체크박스와 비슷하게 생긴 라디오버튼과 차이점만 알면 쉽게 이해할 수 있다.

 

체크박스는 체크하는 칸이 네모칸이고 라디오버튼은 체크하는 칸이 동그란 버튼이다.

 

체크박스는 다중 선택이 가능하고 라디오버튼은 한개만 선택가능하다.

 

누가 정한것인지 모르겠지만 프로그래밍 언어가 다르고 프레임워크가 다르더라도 사용자가 보는 UI의 모양은 같다. 웹사이트에서 회원가입할 때 많이 봤을 것이다. 가장 단순하면서도 유용한 기능이다.

 

라디오버튼, 체크박스, 레이블이나 각각의 특성에 따라 처리과정이 달라지는 것을 알 수 있다.

 

체크박스를 클릭하는 순간 이벤트가 일어나는 것이고 클릭한 상자를 표시하는 것 까지는 프레임워크가 알아서 해주는 부분이다. 당연하지만 만약 프로그래머가 그것까지 처리해야 한다면 생각할 일은 더 많아 지고 코드가 길어질 것이다. 그래서 대부분의 GUI 프레임워크는 이런 부분을 가려주는 작업을 해놨다. 프로그램의 추상화라고 할 수 있다.

 

컴퓨터 소프트웨어를 다루는 사람들이 하는 일의 거의 모든 범위에 추상화(Abstraction)라는 개념이 담겨 있다. 추상화... 감은 오는데 막상 구체적으로 설명하라고 하면 제대로 설명하는 사람은 많지 않다. 왜냐하면 추상화라는 개념이 어렵기 때문이다.

 

추상화는

 

1. 가르치기 어렵고,

 

2. 배우기 어렵다.

 

그런데 사람들은 이게 무슨 말인지 안다. 따라서 안 가르쳐도 된다... 는 생각도 없다고 할 수 없다. 객체지향 프로그래밍의 상당수는 추상화에 대한 내용인데 완벽하게 이해하지 않아도 사용하는데는 문제가 없긴 하다.

 

추상화에 대한 이야기만 해도 끝이 없을 것 같다.

 

하지만 프로그래밍 발전이 지속적으로 기술의 추상화를 가속화하고 있다는 것을 보면 아마 몇십년 후에는 코딩 자체가 필요없는 시대가 오지 않을까도 상상해본다. 미래의 후손들은 과거가 된 오늘의 IT역사를 공부하며 미개함을 느낄지 모르겠다.

(오늘 우리가 부모 세대의 유년시절을 상상하는 것 처럼 되지 않으란 법은 없다. 기술발달의 속도는 인간의 적응 속도를 넘어선다.)


체크박스를 생성하는 것은 다른 위젯을 만드는 과정과 크게 다른 부분이 없다. 원래 GUI 프로그래밍이란게 윈도우 창이라는 틀 안에서 다양성을 추구하다 보니까 반복적인 부분이 많다. 어렵게 생각하지 말고 쉽게쉽게 진도를 나갈 수 있다는 것음 좋은 점이고 새로운 GUI프레임워크가 나온다고 하더라도 기본틀이 거의 바뀌지 않을 것이다.

 

VR/AR GUI나 4D GUI ? 이런 게 나온다면 프로그래밍 방식이 달라질 수는 있다. 그런데 애플의 GUI가 나온 후 20년이 넘도록 바뀐 것은 터치 스크린 정도밖에 없다. VR GUI가 최근에 핫하지만 이것은 어떤 식으로 갈지 아직은 알 수 없다. AR에 대한 기대가 큰 것은 사실인데 지금까지 IT기술 발달의 과정을 보면 한번쯤 퀀텀점프를 할 때가 되지 않았나 싶다. 2021년이면 스티브 잡스가 타계한지 10주년이다. 조만간 뭔가 나올 것 같기도 하다.

 

위의 코드는 체크박스를 생성하고 이벤트 처리함수에 연결시킨다.

 

체크박스는 보통 하나가 아니라 여러개니까 이러한 코드를 반복해서 작성하면된다.

 

setChecked 는 False로 해둔다. 라디오버튼과 달리 체크박스는 여러개를 동시에 선택할 수 있다.

 

* isChecked 는 각 체크박스에 체크가 되었는지 검사한다. 체크가 된 것들을 출력한다. 문자열의 내장함수인 join 메서드를 사용하면 리스트의 내용을 합쳐준다.

 

setText 에서 레이블에 표시하는 것은 for 문을 사용해서 하나의 문자열을 만들어서 전달한다. print 문은 워낙에 유연하기 때문에 join을 자유롭게 사용할 수 있지만 보통 프레임워크가 제공하는 메서드들은 오버로딩이 어떻게 돌아가는지 모르기 때문에 혹시 모를 변수를 제거하기 위해서 표현식을 사용하기 보다 완전한 문자열을 전달하는게 좋다.

 

코드를 실행하면 아래와 같은 결과를 볼 수 있다.

 

콘솔에 제대로 출력이 되면 프로그램의 로직이 나오니까 각 체크박스에 해당하는 프로그램 기능을 구현하면 된다. 콘솔에 표시하는 이유는 파이큐티에서 제대로된 결과값을 받을 수 있다면 응용이 가능하기 때문이다. 단순히 GUI를 배운다고 생각하면 학습의욕이 떨어지니까 프레임워크를 학습하면 반드시 자신의 프로젝트에 적용하는 습관을 기르는게 좋다.

 

 

* 소스코드

from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
from PyQt5 import QtGui
import sys

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.count = 0
        self.initialize()

    def initialize(self):
        self.setGeometry(300, 300, 500, 300)
        layout = QVBoxLayout()
        self.setLayout(layout)

        self.checkbox1 = QCheckBox("CPU")
        self.checkbox1.setChecked(False)
        self.checkbox1.setFont(QtGui.QFont('Hack', 15))
        self.checkbox1.toggled.connect(self.checkbox_toggled)
        layout.addWidget(self.checkbox1)

        self.checkbox2 = QCheckBox("Graphic Card")
        self.checkbox2.setChecked(False)
        self.checkbox2.setFont(QtGui.QFont('Hack', 15))
        self.checkbox2.toggled.connect(self.checkbox_toggled)
        layout.addWidget(self.checkbox2)

        self.checkbox3 = QCheckBox("Mainboard")
        self.checkbox3.setChecked(False)
        self.checkbox3.setFont(QtGui.QFont('Hack', 15))
        self.checkbox3.toggled.connect(self.checkbox_toggled)
        layout.addWidget(self.checkbox3)

        self.label = QLabel("[CHECKBOX]")
        self.label.setAlignment(Qt.AlignCenter)
        self.label.setFont(QtGui.QFont('Hack', 20))
        layout.addWidget(self.label)


    def checkbox_toggled(self):
        checked = []
        items = ""

        if self.checkbox1.isChecked():
            checked.append("CPU")

        if self.checkbox2.isChecked():
            checked.append("Graphic Card")

        if self.checkbox3.isChecked():
            checked.append("Mainboard")

        print("* Selected: %s" % ", ".join(checked))

        for item in checked:
            items += "*checked : " + item + "\n"
            self.label.setText(items)


app = QApplication(sys.argv)
screen = Window()
screen.show()
sys.exit(app.exec_())

 

Tutorial/PyQtQCheckBox.py at main · kayken7/Tutorial (github.com) 깃허브

 

kayken7/Tutorial

Contribute to kayken7/Tutorial development by creating an account on GitHub.

github.com

공유하기

facebook twitter kakaoTalk kakaostory naver band