상세 컨텐츠

본문 제목

[Qt] 페이지 전환하기

Qt

by 전산거북이 2026. 4. 16. 18:08

본문

이번에는 만들어진 여러 페이지들 사이에서 이동하는 것을 해봅시다.

그냥 툭툭 하면 되는줄 알았는데 쪼오오오금 복잡해서 GPT 도움 좀 받았습니다ㅠ (사실 막 어렵고 그런건 아닌데 그냥 아직 안배웠던거라 많이 찾아봐야 했습니다. 여러분들은 그냥 이거 하나로 끝내길)

 

처음 시도한 것은 slot에서 그냥 페이지 생성해서 보여주는 것이였습니다.

// login.cpp (화면 1이라고 생각하면 됩니다.)
void Login::on_pushButton_clicked()
{
    // mainpage(화면 2라고 생각하면 됩니다.) 페이지를 실행한다.
    MainPage mainPage;
    mainPage.show();

    this->close();
}

대충 보면 그럴듯해 보입니다. 실제로 이 코드는 main함수의 것을 그대로 가져왔으니까요. 문제가 생길 이유가 없다고 생각했습니다.

// main.cpp의 일부
	
    Login login_dialog;
    login_dialog.show();

 

비슷하죠?

 

그러나 치명적인 문제가 존재합니다.

이렇게 페이지를 열면 열리자마자 닫힙니다. 왜 그럴까요?

이유는 간단합니다. 함수가 끝나면서 mainPage의 생명 주기도 같이 끝나버렸기 때문입니다.

학부생 때 배웠던 것을 떠올려봅시다. 함수가 실행되면 그 함수에 대한 정보들은 어디에 저장될까요? 바로 스택입니다. 맙소사... 여기서도 지겨운 메모리 구조가 등장합니다. 어쩔수 없습니다. C계열은 원래 그런 것. 그리고 이런거 잘해야 어디가서 이쁨받지 않겠습니까?

 

그럼 어떻게 하면 될까요?

당연히 Heap 메모리에 MainPage를 만들면됩니다. 그리고 그건 Pointer를 사용하면 간단히 해결됩니다.

void Login::on_pushButton_clicked()
{
    // mainpage 페이지를 실행한다.
    MainPage* mainPage = new MainPage();
    mainPage->show();

    this->close();
}

MainPage의 포인터로 생성하면 힙에 mainpage가 생성되겠죠? 확실히 하나 짚고 넘어가는게 좋을 것 같습니다. mainPage라는 변수는 저 함수의 스택에 생성됩니다. 그러나 mainPage가 가리키는 곳은 힙에 남아있을 것입니다.

 

그럼 모든 것이 해결되었을까요?

그렇진 않습니다.

Heap에 남아있다고 그랬죠? 이거 그대로 두면 memory leaking 현상이 발생할 수도 있습니다. 그러니 이를 지워야 합니다. 원래 Qt는 부모에 속하게 되면 자동으로 삭제를 한다고 배웠습니다만, 이렇게 생성하면 부모가 없으니 직접 지우거나 해야합니다.

근데 그러면 너무 불편하잖아요? 그래서 새로운 해결책을 가져왔습니다.

 

void Login::on_pushButton_clicked()
{
    // mainpage 페이지를 실행한다.
    MainPage* mainPage = new MainPage();
    mainPage->setAttribute(Qt::WA_DeleteOnClose);
    mainPage->show();

    this->close();
}

 

뭐가 달라졌는지 보이시나요? 바로 setAttribute() 함수의 추가입니다.

넘겨받는 인자를 보면 DeleteOnClose 라고 되어있습니다. 이걸 넣어준다면 화면이 닫힐 때 자동으로 삭제를 해 주게 됩니다. 즉, heap에 있던 메모리를 깔끔하게 지워준다고 볼 수 있습니다.

 

결국 완성된 코드는 생각보다 간단합니다. 그러나, 조금은 메모리까지 생각해보고자 좀 길게 적게 되었네요. 다음번엔 TMI를 좀 줄이도록 노력해보도록 하겠습니다ㅜ

관련글 더보기

댓글 영역