FrameWork/PyQT

파이썬 라이브러리 PyQT을 통해 메시지 박스 생성하고 이벤트 연결하기

JHeaon 2023. 7. 5. 01:21

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")

'FrameWork/PyQT'의 다른글

  • 현재글 파이썬 라이브러리 PyQT을 통해 메시지 박스 생성하고 이벤트 연결하기

관련글