본문 바로가기
Python Library/PySide

[PySide] 대화 상자 (Dialogs) (1)

by goatlab 2022. 6. 27.
728x90
반응형
SMALL

대화 상자 (Dialogs)

 

대화 상자는 사용자와 통신 할 수 있는 유용한 GUI 구성 요소이다. 파일 열기/저장, 설정, 환경 설정 또는 응용 프로그램의 기본 UI에 맞지 않는 기능에 일반적으로 사용된다. 닫힐 때까지 기본 응용 프로그램 앞에 있는 작은 modal (또는 차단) 창이다. Qt는 가장 일반적인 사용 사례에 대해 여러 내장 대화 상자를 제공하여 플랫폼 고유의 사용자 경험을 제공할 수 있도록 한다.

 

표준 GUI 기능 — 검색 대화 상자
표준 GUI 기능 — 파일 열기 대화 상자

 

Qt에서 대화 상자는 QDialog클래스에 의해 처리된다. 새 대화 상자를 만들려면 다른 위젯 QDialog (ex: QMainWindow 부모)을 전달하는 유형의 새 개체를 만들기만 하면 된다.

 

import sys

from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("My App")

        button = QPushButton("Press me for a dialog!")
        button.clicked.connect(self.button_clicked)
        self.setCentralWidget(button)

    def button_clicked(self, s):
        print("click", s)

app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec_()

 

버튼 누름의 신호를 받는 button_clicked 슬롯에서 대화 상자 인스턴스를 만들고 QMainWindow 인스턴스를 부모로 전달한다. 이것은 대화 상자를 QMainWindow의 modal창으로 만든다. 즉, 대화 상자가 상위 창과의 상호 작용을 완전히 차단한다.

 

import sys

from PySide6.QtWidgets import QApplication, QDialog, QMainWindow, QPushButton

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("My App")

        button = QPushButton("Press me for a dialog!")
        button.clicked.connect(self.button_clicked)
        self.setCentralWidget(button)

    def button_clicked(self, s):
        print("click", s)

        dlg = QDialog(self)
        dlg.setWindowTitle("HELLO!")
        dlg.exec_()

app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec_()

 

대화 상자를 만든 후에는 응용 프로그램의 기본 이벤트 루프를 만들 때 .exec_()와 마찬가지로 다음 QApplication을 사용하여 대화 상자를 시작한다. 실행하면 QDialog 대화 상자에 특정한 완전히 새로운 이벤트 루프가 생성된다.

 

창을 오버레이하는 빈 대화 상자

 

사용자가 modal을 수락하거나 거부할 수 있도록 대화 제목과 확인 및 취소 버튼 세트를 추가하여 문제를 수정한다.

 

사용자 정의하기 위해 QDialog를 하위 분류할 수 있다.

 

class CustomDialog(QDialog):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("HELLO!")

        QBtn = QDialogButtonBox.Ok | QDialogButtonBox.Cancel

        self.buttonBox = QDialogButtonBox(QBtn)
        self.buttonBox.accepted.connect(self.accept)
        self.buttonBox.rejected.connect(self.reject)

        self.layout = QVBoxLayout()
        message = QLabel("Something happened, is that OK?")
        self.layout.addWidget(message)
        self.layout.addWidget(self.buttonBox)
        self.setLayout(self.layout)

 

위의 코드에서 먼저 CustomDialog를 호출하여 QDialog 하위 클래스를 생성한다. QMainWindow 객체가 생성될 때 사용자 정의가 적용되도록 클래스 __init__블록에 사용자 정의를 적용한다. 먼저, QDialog에 대한 .setWindowTitle() 제목을 주 창에 대해 설정한 것과 정확히 동일하게 설정한다.

 

다음 코드 블록은 대화 상자 버튼을 만들고 표시하는 것과 관련이 있다. 이것은 다른 플랫폼에서 대화 버튼 위치를 처리하는 Qt의 유연성이다.

 

QDialogButtonBox 대화 상자 단추 상자를 만드는 첫 번째 단계는 의 네임스페이스 속성을 사용하여 표시할 단추를 정의하는 것이다. 사용 가능한 전체 버튼 목록은 다음과 같다.

 

  • QDialogButtonBox.Ok
  • QDialogButtonBox.Open
  • QDialogButtonBox.Save
  • QDialogButtonBox.Cancel
  • QDialogButtonBox.Close
  • QDialogButtonBox.Discard
  • QDialogButtonBox.Apply
  • QDialogButtonBox.Reset
  • QDialogButtonBox.RestoreDefaults
  • QDialogButtonBox.Help
  • QDialogButtonBox.SaveAll
  • QDialogButtonBox.Yes
  • QDialogButtonBox.YesToAll
  • QDialogButtonBox.No
  • QDialogButtonBox.Abort
  • QDialogButtonBox.Retry
  • QDialogButtonBox.Ignore
  • QDialogButtonBox.NoButton

 

이것들은 생각할 수 있는 모든 대화 상자를 만드는 데 충분해야 한다. pipe(|)를 사용하여 여러 버튼을 OR-ing으로 연결하여 여러 버튼의 라인을 구성할 수 있다. Qt는 플랫폼 표준에 따라 주문을 자동으로 처리한다. 예를 들어, 확인 및 취소 버튼을 표시하기 위해 다음을 사용한다.

 

buttons = QDialogButtonBox.Ok | QDialogButtonBox.Cancel

 

이제 변수 buttons에는 두 버튼을 나타내는 정수 값이 포함된다. 다음으로 QDialogButtonBox 버튼을 보유할 인스턴스를 생성해야 한다. 표시할 버튼의 플래그는 첫 번째 매개변수로 전달된다.

 

QDialogButtonBox버튼이 효과를 나타내도록 하려면 대화 상자의 슬롯에 올바른 신호를 연결해야 한다. accepted 및 rejected 신호를 QDialogButtonBox에서 .accept()과 .reject()QDialog의 서브클래스에 대한 핸들러에 연결한다.

 

마지막으로 QDialogButtonBox 대화 상자에 나타나게 하려면 대화 상자 레이아웃에 추가해야 한다. 따라서, 기본 창의 경우 레이아웃을 만들고 추가한 다음 QDialogButtonBox 대화 상자에서 해당 레이아웃을 설정한다. MainWindow.button_clicked 슬롯은 CustomDialog에서 시작한다.

 

class MainWindow(QMainWindow):
    # ... add the following method after the __init__
    def button_clicked(self, s):
        print("click", s)

        dlg = CustomDialog()
        if dlg.exec_():
            print("Success!")
        else:
            print("Cancel!")

레이블과 버튼이 있는 대화 상자

 

버튼을 클릭하여 대화 상자를 시작하면 해당 대화 상자가 부모 창에서 멀리 떨어진 곳에 표시되는 것을 알 수 있다. 아마도 화면 중앙에 있을 것이다. 일반적으로 사용자가 쉽게 찾을 수 있도록 시작 창 위에 대화 상자가 나타나길 원한다. 이렇게 하려면 대화 상자에 대한 부모 를 Qt에 제공해야 한다. 기본 창을 부모로 전달하면 Qt는 대화 상자의 중심이 창의 중심과 정렬되도록 새 대화 상자를 배치한다.

 

parent 매개변수를 허용하도록 CustomDialog 클래스를 수정할 수 있다.

 

class CustomDialog(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.setWindowTitle("HELLO!")

        QBtn = QDialogButtonBox.Ok | QDialogButtonBox.Cancel

        self.buttonBox = QDialogButtonBox(QBtn)
        self.buttonBox.accepted.connect(self.accept)
        self.buttonBox.rejected.connect(self.reject)

        self.layout = QVBoxLayout()
        message = QLabel("Something happened, is that OK?")
        self.layout.addWidget(message)
        self.layout.addWidget(self.buttonBox)
        self.setLayout(self.layout)

 

그런 다음 CustomDialog의 인스턴스를 만들 때 기본 창을 매개변수로 전달할 수 있다. button_clicked 방법에서 self는 기본 창 개체입니다.

 

    def button_clicked(self, s):
        print("click", s)

        dlg = CustomDialog(self)
        if dlg.exec_():
            print("Success!")
        else:
            print("Cancel!")

부모 창 중앙에 있는 대화 상자

728x90
반응형
LIST

'Python Library > PySide' 카테고리의 다른 글

[PySide] 대화 상자 (Dialogs) (2)  (0) 2022.06.27
[PySide] 메뉴 (Menus)  (0) 2022.06.27
[PySide] 툴바 (Toolbars)  (0) 2022.06.27
[PySide] 레이아웃 (Layouts) (3)  (0) 2022.06.23
[PySide] 레이아웃 (Layouts) (2)  (0) 2022.06.23