파이썬 라이브러리 PyQT을 통해 메시지 박스 생성하고 이벤트 연결하기
Pyqt에서는 message box을 새롭게 만들 수 있도록 제공하는 모듈 위젯이 있다. 해당 모듈을 import 해야만 message box을 만들 수 있다. 오늘은 Pyqt에서 메시지 박스를 컨트롤하는 방법에 대해 알아보자.
메시지 박스
Pyqt에서 Message box에도 여러 종류가 있다. 크게는 2가지가 있는데 그 종류는 다음과 같다.
- 확인 메시지 박스 : 말 그대로 확인용도의 메시지 박스
- 예/아니요 메시지 박스 : 예/아니요를 선택할 수 있는 메시지 박스
오늘은 이 메시지 박스에 대해서 알아보도록 하자.
확인 메시지 박스
일반적으로 확인하는 원 버튼 Message Box을 작성하는 방법은 다음과 같다.
1. from PySide6.QtWidgets import QMessage을 임포트 한다.
2. 컴포넌트에 함수를 연결한다.
3. 함수에 메시지 박스가 생성되도록 객체를 생성한다.
아래는 이 과정을 코드로 나타낸 예이다.
"""
QMessageBox 위젯을 import 해온다.
"""
from PySide6.QtWidgets import (QApplication, QMainWindow, QPushButton,
QSizePolicy, QWidget, QMessageBox)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.btn_hi = QPushButton(self.centralwidget)
self.btn_hi.setObjectName(u"btn_hi")
self.btn_hi.setGeometry(QRect(320, 260, 151, 41))
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QMetaObject.connectSlotsByName(MainWindow)
# 버튼에 함수 연결
self.btn_hi.clicked.connect(self.click)
def click(self):
# click 함수가 실행 될때, QMessageBox()가 생성된다.
mb_hi = QMessageBox()
mb_hi.setText("하이요")
mb_hi.exec()
버튼을 누르게 되면 다음과 같은 버튼이 생성되게 된다.
예, 아니요 메시지 박스
예, 아니요 버튼이 달린 Message box을 만들고 싶다면 다음과 같이 소스코드를 작성하면 된다.
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.btn_hi = QPushButton(self.centralwidget)
self.btn_hi.setObjectName(u"btn_hi")
self.btn_hi.setGeometry(QRect(320, 260, 151, 41))
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QMetaObject.connectSlotsByName(MainWindow)
# 버튼에 함수 연결
self.btn_hi.clicked.connect(self.click)
def click(self):
mb_quiz = QMessageBox()
mb_quiz.setText("계속 진행 할까요?")
# addButton() 을 통해서 버튼을 추가 할 수 있다.
mb_quiz.addButton("actionRole", QMessageBox.ActionRole)
mb_quiz.addButton("NoRole", QMessageBox.NoRole)
mb_quiz.exec()
📢 ActionRole, NoRole의 차이점은 버튼의 위치를 나타내는데 대부분의 사람들이 오른쪽 아래를 선택을 많이 하기 때문에 긍정적인 답변은 ActionRole을 통해서 오른쪽에 배치해 두며, 부정적인 답변은 NoRole을 통해 왼쪽에 배치해도 처리한다.
☑️ ActionRole : 버튼을 오른쪽에서부터 추가
☑️ NoRole : 버튼을 왼쪽에서부터 추가
메시지 박스에 나온 버튼을 클릭의 결과에 따라 해당 행동을 제어하고 싶다면 다음과 같이 소스코드를 작성한다.
clickeedButton()을 이용하여 어떤 버튼을 클릭하였는지 판별하여 다른 코드를 작성하는 편이다.
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.btn_hi = QPushButton(self.centralwidget)
self.btn_hi.setObjectName(u"btn_hi")
self.btn_hi.setGeometry(QRect(320, 260, 151, 41))
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QMetaObject.connectSlotsByName(MainWindow)
# 버튼에 함수 연결
self.btn_hi.clicked.connect(self.click)
def click(self):
mb_quiz = QMessageBox()
mb_quiz.setText("계속 진행 할까요?")
btn_answer_yes = mb_quiz.addButton("actionRole", QMessageBox.ActionRole)
btn_answer_no = mb_quiz.addButton("NoRole", QMessageBox.NoRole)
mb_quiz.exec()
# mb_quiz.clickedButton()을 통해서 어떤 button 을 click 하였는지
# 판별합니다.
if mb_quiz.clickedButton() == btn_answer_yes:
print("yes")
elif mb_quiz.clickedButton() == btn_answer_no:
print("no")