Pyqt - QPushButton,QLabel,QCheckBox

지환·2023년 6월 1일
0

python

목록 보기
7/12

QPushButton

푸시 버튼(push button) 또는 명령 버튼(command button)은 사용자가 프로그램에 명령을 내려서 어떤 동작을 하도록 할 때 사용되는 버튼이며, GUI 프로그래밍에서 가장 흔하게 사용되고 중요한 위젯입니다.

자주 쓰이는 메서드

setCheckable()

  • True 설정 시, 누른 상태와 그렇지 않은 상태를 구분합니다.

toggle()

  • 상태를 바꿉니다.

setIcon()

  • 버튼의 아이콘을 설정합니다.

setEnabled()

  • False 설정 시, 버튼을 사용할 수 없습니다.

isChecked()

  • 버튼의 선택 여부를 반환합니다.

setText()

  • 버튼에 표시될 텍스트를 설정합니다.

text()

  • 버튼에 표시된 텍스트를 반환합니다.

자주 쓰이는 시그널.

clicked()

  • 버튼을 클릭할 때 발생합니다.

pressed()

  • 버튼이 눌렸을 때 발생합니다.

released()

  • 버튼을 눌렀다 뗄 때 발생합니다.

toggled()

  • 버튼의 상태가 바뀔 때 발생합니다.

이제 QPushButton 클래스를 이용해서 푸시 버튼을 만들어보겠습니다.

예제

## Ex 5-1. QPushButton.

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout


class MyApp(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        btn1 = QPushButton('&Button1', self)
        btn1.setCheckable(True)
        btn1.toggle()

        btn2 = QPushButton(self)
        btn2.setText('Button&2')

        btn3 = QPushButton('Button3', self)
        btn3.setEnabled(False)

        vbox = QVBoxLayout()
        vbox.addWidget(btn1)
        vbox.addWidget(btn2)
        vbox.addWidget(btn3)

        self.setLayout(vbox)
        self.setWindowTitle('QPushButton')
        self.setGeometry(300, 300, 300, 200)
        self.show()


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

세 개의 다양한 푸시 버튼을 만들었습니다.

구체적인 설명

btn1 = QPushButton('&Button1', self)
btn1.setCheckable(True)
btn1.toggle()
  1. QPushButton 클래스로 푸시 버튼을 하나 만듭니다. 첫 번째 파라미터로는 버튼에 나타날 텍스트, 두 번째는 버튼이 속할 부모 클래스를 지정해줍니다.

  2. 버튼에 단축키(shortcut)를 지정하고 싶으면 아래와 같이 해당 문자 앞에 ampersand('&')를 넣어주면 됩니다. 이 버튼의 단축키는 'Alt+b'가 됩니다.

  3. setCheckable()을 True로 설정해주면, 선택되거나 선택되지 않은 상태를 유지할 수 있게 됩니다.

  4. toggle() 메서드를 호출하면 버튼의 상태가 바뀌게 됩니다. 따라서 이 버튼은 프로그램이 시작될 때 선택되어 있습니다.

btn2 = QPushButton(self)
btn2.setText('Button&2')
  1. setText() 메서드로도 버튼에 표시될 텍스트를 지정할 수 있습니다.
  1. 또한 이 버튼의 단축키는 'Alt+2'가 됩니다.
btn3 = QPushButton('Button3', self)
btn3.setEnabled(False)

setEnabled()를 False로 설정하면, 버튼을 사용할 수 없게 됩니다.

QLabel

QLabel 위젯은 텍스트 또는 이미지 라벨을 만들 때 쓰입니다. 사용자와 어떤 상호작용을 제공하지는 않습니다.

라벨은 기본적으로 수평 방향으로는 왼쪽, 수직 방향으로는 가운데 정렬이지만 setAlignment() 메서드를 통해 조절할 수 있습니다.

라벨을 하나 만들고, 라벨의 스타일과 관련된 몇 개의 메서드들을 사용해 보겠습니다.

예제

## Ex 5-2. QLabel.

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
from PyQt5.QtCore import Qt


class MyApp(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        label1 = QLabel('First Label', self)
        label1.setAlignment(Qt.AlignCenter)

        label2 = QLabel('Second Label', self)
        label2.setAlignment(Qt.AlignVCenter)

        font1 = label1.font()
        font1.setPointSize(20)

        font2 = label2.font()
        font2.setFamily('Times New Roman')
        font2.setBold(True)

        label1.setFont(font1)
        label2.setFont(font2)

        layout = QVBoxLayout()
        layout.addWidget(label1)
        layout.addWidget(label2)

        self.setLayout(layout)

        self.setWindowTitle('QLabel')
        self.setGeometry(300, 300, 300, 200)
        self.show()


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

구체적인 설명

label1 = QLabel('First Label', self)
label1.setAlignment(Qt.AlignCenter)
  1. QLabel 위젯을 하나 만들었습니다. 생성자에 라벨 텍스트와 부모 위젯을 입력해줍니다.

  2. setAlignment() 메서드로 라벨의 배치를 설정할 수 있습니다.

  3. Qt.AlignCenter로 설정해주면 수평, 수직 방향 모두 가운데 위치하게 됩니다.

font1 = label1.font()
font1.setPointSize(20)
  1. 라벨에 사용될 폰트를 하나 만들었습니다.
  1. setPointSize() 메서드로 폰트의 크기를 설정해줍니다.
label2 = QLabel('Second Label', self)
label2.setAlignment(Qt.AlignVCenter)

두번째 라벨을 만들고, 이번에는 수직 방향으로만 가운데 (Qt.AlignVCenter)로 설정해줍니다.

수평 방향으로 가운데로 설정하려면 Qt.AlignHCenter를 입력해주면 됩니다.

font2 = label2.font()
font2.setFamily('Times New Roman')
font2.setBold(True)

두번째 라벨에 설정할 폰트를 하나 만들고, setFamily() 메서드로 폰트의 종류를 'Times New Roman'으로 설정해줍니다.

setBold(True)로 폰트를 진하게 설정합니다.

이번에는 폰트의 크기를 설정하지 않았기 때문에 디폴트 크기인 13으로 설정됩니다.

QCheckBox

QCheckBox 위젯은 on(체크됨)/off(체크안됨)의 두 상태를 갖는 버튼을 제공합니다. 이 위젯은 하나의 텍스트 라벨과 함께 체크 박스를 제공

체크 박스가 선택되거나 해제될 때, stateChanged() 시그널을 발생합니다. 체크 박스의 상태가 변할 때마다 어떠한 동작을 발생시키고 싶을 때, 이 시그널을 특정 슬롯에 연결할 수 있습니다.

또한 체크 박스의 선택 여부를 확인하기 위해서, isChecked() 메서드를 사용할 수 있습니다. 선택 여부에 따라 boolean 값을 반환합니다.

일반적인 체크 박스는 선택/해제 상태만을 갖지만, setTristate() 메서드를 사용하면 '변경 없음(no change)' 상태를 가질 수 있습니다. 이 체크 박스는 사용자에게 선택하거나 선택하지 않을 옵션을 줄 때 유용합니다.

세 가지 상태를 갖는 체크 박스의 상태를 얻기 위해서는 checkState() 메서드를 사용합니다. 선택/변경 없음/해제 여부에 따라 각각 2/1/0 값을 반환합니다.

QButtonGroup 클래스를 사용하면 여러 개의 버튼을 묶어서 exclusive/non-exclusive 버튼 그룹을 만들 수 있습니다. exclusive 버튼 그룹은 여러 개 중 하나의 버튼만 선택할 수 있습니다.

자주 쓰이는 메서드

text()

체크 박스의 라벨 텍스트를 반환합니다.

setText()

체크 박스의 라벨 텍스트를 설정합니다.

isChecked()

체크 박스의 상태를 반환합니다. (True/False)

checkState()

체크 박스의 상태를 반환합니다. (2/1/0)

toggle()

체크 박스의 상태를 변경합니다.

자주 쓰이는 시그널

pressed()

체크 박스를 누를 때 신호를 발생합니다.

released()

체크 박스에서 뗄 때 신호를 발생합니다.

clicked()

체크 박스를 클릭할 때 신호를 발생합니다.

stateChanged()

체크 박스의 상태가 바뀔 때 신호를 발생합니다.

예제

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QCheckBox
from PyQt5.QtCore import Qt


class MyApp(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        cb = QCheckBox('Show title', self)
        cb.move(20, 20)
        cb.toggle()
        cb.stateChanged.connect(self.changeTitle)

        self.setWindowTitle('QCheckBox')
        self.setGeometry(300, 300, 300, 200)
        self.show()

    def changeTitle(self, state):
        if state == Qt.Checked:
            self.setWindowTitle('QCheckBox')
        else:
            self.setWindowTitle(' ')


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

체크박스를 하나 만들고, 체크가 되어 있을 때 타이틀바에 'QCheckBox' 글자가 나타나도록 했습니다.

구체적인 설명

cb = QCheckBox('Show title', self)

'Show title'이라는 텍스트 라벨을 갖는 체크박스를 하나 만듭니다.

cb.toggle()

체크박스는 디폴트로 체크가 되어있지 않은 off 상태로 나타나기 때문에 on 상태로 바꾸기 위해 toggle() 메서드를 사용했습니다.

cb.stateChanged.connect(self.changeTitle)

체크박스의 상태가 바뀔 때 발생하는 시그널 (stateChanged)을 우리가 정의한 changeTitle() 메서드에 연결합니다.

def changeTitle(self, state):

    if state == Qt.Checked:
        self.setWindowTitle('QCheckBox')
    else:
        self.setWindowTitle(' ')

체크박스의 상태 (state)가 changeTitle() 메서드의 매개변수로 주어집니다.

체크가 되어있으면 타이틀을 'QCheckBox'로, 그렇지 않으면 빈 문자열로 나타내게 됩니다.

출처) https://wikidocs.net/21937

profile
아는만큼보인다.

0개의 댓글