Python/PyQt5

[PyQt5] 6. Widgets

컴닥 2021. 5. 19. 16:46
반응형

Qt5에는 다음과 같이 다양한 위젯이 있습니다.

다행히 아이콘만 보더라도
대부분의 위젯이 어떤 용도로 사용되는지
알 수 있습니다. 

비슷비슷한 위젯을 
비슷비슷한 코드로 나열하는 것은 
지루한 일입니다. 

공식 문서와 구글링 및 Qt Designer 사용을 추천드리고,
여기서는 제가 자주 쓰는 위젯만 간단히 나열하겠습니다. 

  • QLabel: 텍스트, 리치 텍스트, 그림, 영상 등을 구현할 수 있음. 
  • QLineEdit: 원 라인 에디터, 패스워드 가능.
  • QTextEdit: 멀티 라인 에디터, 리치 텍스트 지원. 
  • QGroupBox: 그룹 박스, 프레임과 제목을 지원하는 컨테이너.
  • QCheckBox: 체크박스 
  • QPushButton: 푸시 버튼
  • QRadioButton: 라디오 버튼
  • QListBox: 리스트 박스
  • QComboBox: 콤보 박스
  • QProgressBar: 프로그레스 바
  • QSlider: 슬라이스 바
  • QMenu: 메뉴
  • QPopupMenu 팝업 메뉴

 

여기서 딱 끝내고 싶지만.. 그래도...

 

Qlabel

앞서 사용했던 위젯입니다. 
공식문서의 Detailed Description를 읽어봅시다. 

https://doc.qt.io/qt-5/qlabel.html

QLabel은 텍스트나 이미지를 표시하는 데 사용된다. 
사용자 상호작용 기능은 제공되지 않는다. 

라고 합니다. 

일반 텍스트, 리치 텍스트(HTML의 Tag도 사용할 수 있습니다.),
픽스 맵, 영화, 숫자 등의 컨텐츠를 담을 수 있네요. 

퍼블릭 슬롯에 setText()가 보입니다. 
label에 text를 쓸 때 사용하는 메서드죠. 
그 위엔 setNum, setMovie, setPicture 등등이 있는데... 
어떻게 쓸 수 있을 지 느낌이 옵니다. 

 

QLineEdit

하나의 라인을 편집할 수 있는 위젯입니다. (멀티 라인 편집은 QTextEdit)
자주 사용되는 메서드로는
텍스트를 쓰는 setText(),
텍스트를 읽는 text(),
배경에 텍스트를 표시하는 setPlaceholderText(),
읽기 전용으로 바꿔주는 setReadOnly(),
주로 암호 입력에 사용되는 setEchoMode() 등이 있습니다.

from PyQt5.QtWidgets import *


class MyWindow(QWidget):

    def __init__(self):
        super().__init__()
        self.line_edit1 = QLineEdit('')
        self.line_edit1.setPlaceholderText('ID')
        self.line_edit1.textChanged.connect(self.line_edit_text_changed)
        self.line_edit2 = QLineEdit('')
        self.line_edit2.setPlaceholderText('PASSWORD')
        self.line_edit2.setEchoMode(QLineEdit.Password)
        self.line_edit2.returnPressed.connect(self.line_edit_return_pressed)
        self.label = QLabel('label')
        layout = QVBoxLayout()
        layout.addWidget(self.line_edit1)
        layout.addWidget(self.line_edit2)
        layout.addWidget(self.label)
        self.setLayout(layout)

    def line_edit_text_changed(self):
        self.label.setText(self.line_edit1.text())

    def line_edit_return_pressed(self):
        self.label.setText(self.line_edit2.text())


app = QApplication([])
my_window = MyWindow()
my_window.show()
app.exec_()

https://github.com/pycrawling/pyqt5_study/blob/main/pyqt5_study_06-1.py

 

QTextEdit

QTextEdit와 유사한 QPlainTextEdit도 있습니다.

플레인 텍스트와 리치 텍스트는 반대말이죠? 

QTextEdit는 리치 텍스트도 지원하고,
QPlainTextEdit는 플레인 텍스트만 지원합니다. 

용도에 맞춰 사용하시면 됩니다. 

from PyQt5.QtWidgets import *


class MyWindow(QWidget):

    def __init__(self):
        super().__init__()
        self.label = QLabel('label')
        self.text_edit = QTextEdit('Text Edit')
        self.text_edit.setPlaceholderText('ID')
        self.button = QPushButton('Enter')
        self.button.clicked.connect(self.button_clicked)
        grid = QVBoxLayout()
        grid.addWidget(self.label)
        grid.addWidget(self.text_edit)
        grid.addWidget(self.button)
        self.setLayout(grid)

    def button_clicked(self):
        self.label.setText(self.text_edit.toPlainText())


app = QApplication([])
my_window = MyWindow()
my_window.show()
app.exec_()

https://github.com/pycrawling/pyqt5_study/blob/main/pyqt5_study_06-2.py

 

QGroupBox, QRadioButton

그룹 박스는 컨테이너기 때문에
레이아웃을 먼저 만들어야 합니다.

먼저 레이아웃에 위젯들을 넣어준 뒤
그룹 박스에 레이아웃을 set 합니다. 

라디오 버튼은 배타적인 방식으로 작동합니다. 
하나의 레이아웃 안에서는 1개만 선택할 수 있습니다. 
이를 풀 수 있는 방법도 있지만
제 경험 상 풀어야 할 필요를 느낀 일은 없었습니다. 

clicked 대신 toggled를 쓸 수도 있지만
toggled와 setChecked를 같이 쓰면
에러가 발생할 수도 있습니다. 

from PyQt5.QtWidgets import *


class MyWindow(QWidget):
    def __init__(self):
        super(MyWindow, self).__init__()

        groupbox = QGroupBox('성별')
        groupbox.setCheckable(True)
        groupbox.setChecked(True)

        self.button0 = QRadioButton('남')
        self.button0.clicked.connect(self.button_clicked)
        self.button1 = QRadioButton('녀')
        self.button1.clicked.connect(self.button_clicked)
        self.button2 = QRadioButton('둘 다 아님')
        self.button2.clicked.connect(self.button_clicked)
        self.button3 = QRadioButton('밝힐 수 없다')
        self.button3.clicked.connect(self.button_clicked)
        self.button3.setChecked(True)

        self.line_edit = QLineEdit('')

        box_layout = QVBoxLayout()
        box_layout.addWidget(self.button0)
        box_layout.addWidget(self.button1)
        box_layout.addWidget(self.button2)
        box_layout.addWidget(self.button3)

        groupbox.setLayout(box_layout)

        layout = QVBoxLayout()
        layout.addWidget(groupbox)
        layout.addWidget(self.line_edit)

        self.setLayout(layout)

    def button_clicked(self):
        if self.button0.isChecked():
            self.line_edit.setText(self.button0.text())
        elif self.button1.isChecked():
            self.line_edit.setText(self.button1.text())
        elif self.button2.isChecked():
            self.line_edit.setText(self.button2.text())
        elif self.button3.isChecked():
            self.line_edit.setText(self.button3.text())


app = QApplication([])
my_window = MyWindow()
my_window.show()
app.exec_()

https://github.com/pycrawling/pyqt5_study/blob/main/pyqt5_study_06-3.py

 

QCheckBox

stateChanged 대신 clicked 쓸 수도 있습니다. 

from PyQt5.QtWidgets import *


class MyWindow(QWidget):
    def __init__(self):
        super(MyWindow, self).__init__()

        groupbox = QGroupBox('가지고 싶은 필기구')
        groupbox.setCheckable(True)
        groupbox.setChecked(True)

        self.button0 = QCheckBox('연필')
        self.button0.stateChanged.connect(self.button_changed)
        self.button1 = QCheckBox('지우개')
        self.button1.stateChanged.connect(self.button_changed)
        self.button2 = QCheckBox('볼펜')
        self.button2.stateChanged.connect(self.button_changed)
        self.button3 = QCheckBox('샤프')
        self.button3.stateChanged.connect(self.button_changed)

        self.line_edit = QLineEdit('')

        box_layout = QVBoxLayout()
        box_layout.addWidget(self.button0)
        box_layout.addWidget(self.button1)
        box_layout.addWidget(self.button2)
        box_layout.addWidget(self.button3)

        groupbox.setLayout(box_layout)

        layout = QVBoxLayout()
        layout.addWidget(groupbox)
        layout.addWidget(self.line_edit)

        self.setLayout(layout)

    def button_changed(self):
        message = []
        if self.button0.isChecked():
            message.append(self.button0.text())
        if self.button1.isChecked():
            message.append(self.button1.text())
        if self.button2.isChecked():
            message.append(self.button2.text())
        if self.button3.isChecked():
            message.append(self.button3.text())
        self.line_edit.setText(', '.join(message))


app = QApplication([])
my_window = MyWindow()
my_window.show()
app.exec_()

https://github.com/pycrawling/pyqt5_study/blob/main/pyqt5_study_06-4.py

 

더 보면 좋겠지만...
위젯은 여기까지만... 

반응형