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_())
'파이썬 > PyQt5' 카테고리의 다른 글
파이썬(Python) PyQt5 레이아웃 QGridLayout 구현하기 (0) | 2021.11.02 |
---|---|
파이썬(Python) PyQt5 QLineEdit 한 줄 입력 라인에디터 사용법 (0) | 2021.11.02 |
파이썬(Python) PyQt5 QStatusBar 구현하기 (0) | 2021.11.01 |
파이썬(Python) PyQt5 QProgressBar 구현하기 (0) | 2021.11.01 |
파이썬(Python) PyQt5 QCheckBox 사용하기 (0) | 2021.11.01 |