본문으로 바로가기
반응형

QDialog 위젯은 현재 윈도우 위에 다른 창을 띄우고 싶을 때 사용합니다. 동작방식에 따라 두 가지로 나눌 수 있습니다. 첫 번째는 다이얼로그창을 삭제하지 않으면 부모창을 제어할 수 없는 구조입니다. 줄여서 모달 방식이라고 합니다. 두 번째는 반대의 경우로 다이얼로그창을 닫지 않아도 부모창을 제어할 수 있습니다. “모달리스 방식이라고 합니다.

 

먼저 다이얼로그 사용을 위해서 QDialog 객체를 생성합니다. QDialog 클래스는 QtWidgets 모듈에 포함되어 있습니다.

from PyQt5.QtWidgets import QDialog

# QDialog 설정
self.dialog = QDialog()

 

다이얼로그 Open 을 위한 버튼 생성과 클릭 이벤트가 발생했을 때 실행할 함수 dialog_open() clicked 시그널에 추가했습니다.

# QButton 위젯 생성
self.button = QPushButton('Dialog Button', self)
self.button.clicked.connect(self.dialog_open)
self.button.setGeometry(10, 10, 200, 50)

 

버튼을 클릭하면 실행하는 dialog_open() 함수에서 구현한 내용을 설명하겠습니다. 내부에는 타이틀의 제목을 지정하는 setWindowTitle() 과 모달/모달리스 여부를 결정하는 setWindowModality() 함수를 사용했습니다. setWindowModality() 의 파라미터로 쓰인 enum 3가지 종류를 제공합니다. 마지막으로 다이얼로그를 화면에 띄우기 위한 함수는 show() 입니다.

 

  • Qt.NonModal : 값은 0 이며, 다른 윈도우 화면 입력을 차단하지 않습니다. 모달리스입니다.
  • Qt.WindowModal : 값은 1 이며, 화면에 있는 모든 윈도우 창의 입력을 차단합니다. 현재 다이얼로그를 실행시킨 부모 프로그램뿐만 아니라 다른 윈도우들도 제어를 막습니다.
  • Qt.ApplicationModal : 값은 2 이며, 다이얼로그를 실행시킨 부모 프로그램만 제어를 막습니다.
# 버튼 이벤트 함수
def dialog_open(self):
    self.dialog.setWindowTitle('Dialog')
    self.dialog.setWindowModality(Qt.ApplicationModal)
    self.dialog.resize(300, 200)
    self.dialog.show()

 

다음은 QDialog 창 내부에 버튼을 추가해서 클릭 이벤트가 발생할 때 QDialog 창을 닫는 기능을 추가하겠습니다. dialog_open() 함수에서 다이얼로그에 추가할 버튼인 QPushButton 위젯 객체를 생성할 때 두개의 파라미터가 필요합니다. 첫 번째 파라미터는 버튼 이름입니다. 두 번째는 버튼이 들어갈 QDialog 객체를 넘깁니다. 마지막으로 QDialog 에 추가한 버튼의 클릭이벤트가 발생하면 실행할 함수를 clicked 시그널에 추가합니다.

# 버튼 이벤트 함수
def dialog_open(self):
    # 버튼 추가
    btnDialog = QPushButton("OK", self.dialog)
    btnDialog.move(100, 100)
    btnDialog.clicked.connect(self.dialog_close)

 

QDialog 에 추가한 버튼의 클릭이벤트가 발생하면 실행할 함수 dialog_close() 의 내용입니다. 다이얼로그 창을 닫는 close() 함수를 추가했습니다.

# Dialog 닫기 이벤트
def dialog_close(self):
    self.dialog.close()

 

전체 소스는 다음과 같습니다. 메인 화면에서 버튼을 클릭하면 QDialog 창을 띄웁니다. 그리고 QDialog 창에 있는 버튼을 클릭하면 창을 닫는 것이 로직의 골자입니다.

#!/usr/bin/env python3
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

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

        # QButton 위젯 생성
        self.button = QPushButton('Dialog Button', self)
        self.button.clicked.connect(self.dialog_open)
        self.button.setGeometry(10, 10, 200, 50)

        # QDialog 설정
        self.dialog = QDialog()

    # 버튼 이벤트 함수
    def dialog_open(self):
        # 버튼 추가
        btnDialog = QPushButton("OK", self.dialog)
        btnDialog.move(100, 100)
        btnDialog.clicked.connect(self.dialog_close)

        # QDialog 세팅
        self.dialog.setWindowTitle('Dialog')
        self.dialog.setWindowModality(Qt.ApplicationModal)
        self.dialog.resize(300, 200)
        self.dialog.show()

    # Dialog 닫기 이벤트
    def dialog_close(self):
        self.dialog.close()

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

반응형