본문 바로가기
SWE/Qt

QWidget과 QDialog의 차이 - Modal/Modeless

by S나라라2 2021. 12. 2.
반응형

 

 

모달위에 모달 죽음의짤ㅋㅋㅋ

  • QWidget과 QDialog의 사용 용도

- QWidget : 보통의 윈도우창.(임베디드환경제외) 보통 윈도우창이라고하면 프레임도 있고 상단에 타이틀 바도 있는 모습

- QDialog : 대개 짧은 기간의 일을 처리할 때 사용되는 창 (예: 메시지 팝업창, 경고창 등) 

 

 

  • 윈도우에서 띄우는 방법

- QWidget: show() 함수를 통해 화면을 띄울 수 있다. -> modeless

- QDialog: exec() 함수를 통해 화면을 띄울 수 있다. -> modal이다.

 

 

  • Modal / Modeless 개념

modal 과 modeless 는 윈도우에 창을 띄울 때 사용되는 개념이다.

 

- modal : modal 속성으로 창을 띄우면 해당 창이 윈도우에서 가장 top-level에 띄워지게 된다. 그리고 다른 창에 접근하지 못한다. 

- modeless : modeless 속성으로 창을 띄우면 어플리케이션의 다른 창에 접근도 가능하고 다른 창에서 이벤트 수신도 가능하다. 

 

예를 들면 modal은 경고팝업창으로 사용자가 무조건 확인후에 다음 스텝으로 넘어갈 수 있고, modeless 는 해당 창을 무시하고 다른 작업을 이어서 할 수 있다.

 

 

  • QDialog 코드 예시

위에서 QDialog는 modal 이라고 설명했으나 사실은 modeless 로도 구현이 가능하다.

보통은 modal 형식으로 많이 사용된다.

 

modal dialog:

void EditorWindow::countWords()
{
	WordCountDialog dialog(this);
    dialog.setWordCount(document().wordCount());
    dialog.exec();
}

 

modeless dialog:

void EditorWindow::find()
{
	if(!findDialog)
    {
    	findDialog = new FindDialog(this);
        connect(findDialog, &FindDialog::findNext, this, &EditorWindow::findNext);
    }
    
    findDialog->show();
    findDialog->raise(); // 시각적으로 window에서 가장 top-level에 보여지도록 한다.
    findDialog->activateWindow(); // 키보드 이벤트 같은 이벤트를 받을 때 가장 먼저 해당 다이얼로그로 오도록 한다.
}
반응형