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)
'파이썬 > PyQt5' 카테고리의 다른 글
파이썬(Python) PyQt5 QSlider 사용하기 (0) | 2021.11.17 |
---|---|
파이썬(Python) PyQt5 QRadioButton 선택 사용하기 (0) | 2021.11.17 |
파이썬(Python) PyQt5 QPixmap 으로 화면에 이미지 표시하기 (0) | 2021.11.15 |
파이썬(Python) PyQt5 QListWidget 위젯 사용하기 (2) | 2021.11.13 |
파이썬(Python) PyQt5 QMainWindow 에서 QToolBar 추가하기 (0) | 2021.11.12 |