본문으로 바로가기

파이썬(Python) PyQt5 QPushButton 버튼 사용하기

category 파이썬/PyQt5 2021. 11. 16. 20:03
반응형

QPushButton 은 프로그램과 사용자가 간에 명령을 전달할 때 가장 많이 쓰이는 GUI 인터페이스 컨트롤입니다. 보통 버튼은 직사각형이며, 이름이 붙습니다. 또한 버튼에 단축키 설정이 가능하며, 이미지인 아이콘을 추가해서 좀더 직관적인 버튼을 만들기도 합니다. 오늘은 PyQt5에서 버튼 클래스인 QPushButton 을 이용해 자주 쓰이는 4가지 시그널과 그 외 함수들을 어떻게 다루는지 간단하게 알아보겠습니다.

 

1. QPushButton 에서 자주 쓰이는 4가지 시그널 함수

 

QPushButton 에서 자주 쓰이는 시그널은 다음과 같습니다. 목록에 있는 시그널이 어떻게 동작하는지 함수를 연결해서 알아보겠습니다.

 

  • clicked() : 버튼을 클릭했을 때 발생
  • pressed() : 버튼을 누르면 발생
  • released() : 버튼을 눌렀다가 뗄 때 발생
  • toggled() : 버튼의 상태가 바뀔 때 발생

 

먼저 토글(toggled) 이벤트에 대해 살펴보겠습니다. toggled 는 버튼의 토글 상태가 바뀔 때 발생하는 이벤트입니다. 버튼의 누른 상태와 그렇지 않은 상태를 구분할 수 있으면 토글 상태가 되었다라고 합니다. 버튼의 기본은 마우스를 누르고 떼면 다시 원래대로 돌아옵니다. 버튼의 속성을 토글이 될 수 있도록 바꾸면 클릭할 때 마다 누른 상태와 그렇지 않은 상태로 바뀝니다. 아래 그림처럼 눌러진 상태가 되면 버튼은 하늘색 배경으로 바뀝니다. 이렇게 컨트롤이 눌러지거나 그렇지 않을 때 발생하는 이벤트가 toggled() 입니다. 어떤 GUI 툴에서는 버튼의 눌러진 상태를 움푹 들어간 모양으로 표시하기 때문에 좀더 구분하기 쉽습니다.

 

위에서 언급했듯이 기본 버튼은 토글 상태를 만들 수 없습니다. 마우스로 버튼을 눌렀다 놓으면 이전 상태로돌아오기 때문에 토글이 되지 않습니다. 버튼을 토글 상태로 만들고 싶다면 setCheckable() 함수로 True 를 세팅해야 합니다. 그리고 toggle() 함수를 실행하면 버튼이 누른 상태나 그렇지 않은 상태로 바뀝니다.

from PyQt5.QtWidgets import QPushButton

#  에서 선택한 값 표시
self.pb_toggled = QPushButton('토글 버튼', self)
self.pb_toggled.setGeometry(10, 10, 150, 30)
self.pb_toggled.toggled.connect(self.change_toggled)
self.pb_toggled.setCheckable(True)
self.pb_toggled.toggle()

# Font 변경을 위한 버튼 위젯 생성
self.pb_clicked = QPushButton('토클 안된 버튼', self)
self.pb_clicked.setGeometry(10, 50, 150, 30)

 

다음은 clicked, released, pressed 이벤트에 각각의 함수를 연결한 버튼을 만들었습니다. pressed 는 마우스를 누르는 순간 이벤트가 발생하고, released 는 마우스를 눌렀다가 떼는 순간 발생합니다. clicked 는 마우스를 누른 상태와 상관없이 클릭하는 순간 발생합니다.

# clicked 이벤트 발생 버튼
self.pb_clicked = QPushButton('clicked Event', self)
self.pb_clicked.setGeometry(10, 50, 150, 30)
self.pb_clicked.clicked.connect(self.button_clicked)

# pressed 이벤트 발생 버튼
self.pb_pressed = QPushButton('pressed Event', self)
self.pb_pressed.setGeometry(10, 90, 150, 30)
self.pb_pressed.pressed.connect(self.button_pressed)

# released 이벤트 발생 버튼
self.pb_released = QPushButton('released Event', self)
self.pb_released.setGeometry(10, 130, 150, 30)
self.pb_released.released.connect(self.button_released)

# 각 시그널에 연결된 함수 
def button_clicked(self):
    print('button_clicked')

def button_pressed(self):
    print('button_pressed')

 

위에서 설명한 내용을 구현한 전체 소스는 다음과 같습니다.

#!/usr/bin/env python3
import sys
from PyQt5.QtWidgets import QMainWindow, \
    QPushButton, QApplication


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # 윈도우 설정
        self.setGeometry(300, 300, 500, 300)  # x, y, w, h
        self.setWindowTitle('Status Window')

        # 버튼의 이름 변경
        self.pb_toggled = QPushButton('토글 버튼', self)
        self.pb_toggled.setGeometry(10, 10, 150, 30)
        self.pb_toggled.toggled.connect(self.change_toggled)
        self.pb_toggled.setCheckable(True)
        self.pb_toggled.toggle()

        # clicked 이벤트 발생 버튼
        self.pb_clicked = QPushButton('clicked Event', self)
        self.pb_clicked.setGeometry(10, 50, 150, 30)
        self.pb_clicked.clicked.connect(self.button_clicked)
        self.pb_clicked.setText('change Button')

        # pressed 이벤트 발생 버튼
        self.pb_pressed = QPushButton('pressed Event', self)
        self.pb_pressed.setGeometry(10, 90, 150, 30)
        self.pb_pressed.pressed.connect(self.button_pressed)

        # released 이벤트 발생 버튼
        self.pb_released = QPushButton('released Event', self)
        self.pb_released.setGeometry(10, 130, 150, 30)
        self.pb_released.released.connect(self.button_released)


    # ComboBox 선택 이벤트
    def change_toggled(self):
        print('toggled change')

    def button_clicked(self):
        print('button_clicked')

    def button_pressed(self):
        print('button_pressed')

    def button_released(self):
        print('button_released')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())

 

2. 그 외 자주 쓰이는 함수

 

setText() 함수는 버튼의 이름을 변경합니다. 객체를 생성할 때 정한 이름을 setText() 함수로 바꿨습니다.

# 버튼의 이름 변경
self.pb_change = QPushButton('released Event', self)
self.pb_change.setGeometry(10, 130, 150, 30)
self.pb_change.setText('Change Label')

 

다음은 버튼을 활성화 및 비활성화로 전환하는 함수입니다. 함수명은 setEnabled() 이며 False 를 넘기면 이벤트를 발생시킬 수 없는 비활성화 버튼이 됩니다.

# 비활성화
self.pb_pressed = QPushButton('비활성화', self)
self.pb_pressed.setGeometry(10, 90, 150, 30)
self.pb_pressed.setEnabled(True)

# 활성화
self.pb_change = QPushButton('활성화', self)
self.pb_change.setGeometry(10, 130, 150, 30)
self.pb_pressed.setEnabled(False)

반응형