2010-12-16 4 views
15

체인에 여러 개의 창을 만들려고합니다. 창 1은 창 2의 부모이고, 창 2는 창 3의 부모입니다. 하나의 창을 닫으면 모든 자식도 닫을 수 있습니다. 현재 최상위 창을 닫으면 다른 모든 창은 원하는대로 닫히지 만 창 2와 같이 닫으면 창 2가 닫히고 창 3은 닫히지 않습니다. 어떻게해야합니까? 당신의 도움을 주셔서 감사합니다!Qt : 부모/자식 체인의 여러 창, 부모가 자식을 닫지 않습니까?

main_window.cpp

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) 
{ 
    QPushButton* button = new QPushButton("Open 1", this); 
    connect(button, SIGNAL(clicked()), this, SLOT(on_button_clicked())); 
} 

void MainWindow::on_button_clicked() { 
    window1 *w = new window1(this); 
    w->show(); 
} 

window1.cpp

window1::window1(QWidget *parent) : QWidget(parent) 
{ 
    this->setWindowFlags(Qt::Window); // in order to have a free-standing window 

    QPushButton* button = new QPushButton("Open 2", this); 
    connect(button, SIGNAL(clicked()), this, SLOT(on_button_clicked())); 
} 

void window1::on_button_clicked() { 
    window2 *w = new window2(this); 
    w->show(); 
} 

window2.cpp

window2::window2(QWidget *parent) : QWidget(parent) 
{ 
    this->setWindowFlags(Qt::Window); 

    QLabel* label = new QLabel("Window 2", this); 
} 

답변

16

기본적으로 QApplication은 마지막 주 창 (부모가없는 창)이 닫히면 (QApplication::lastWindowClosed signal 참조), 이므로 MainWindow를 닫으면 모든 것이 닫히게됩니다.

속성 Qt :: WA_DeleteOnClose가 설정되어 있지 않으면 위젯을 삭제해도 삭제되지 않습니다 (QWidget::close() 참조). 그냥 창을 닫으려면 closeEvent()를 다시 구현하여 자식에서 close()를 호출해야한다고 생각합니다.

그러나 닫을 때 삭제하려면 Qt :: WA_DeleteOnClose 속성을 설정하십시오. 부모가 삭제되면 하위 항목이 자동으로 삭제됩니다.

+0

그건 속임수였습니다! "w-> setAttribute (Qt :: WA_DeleteOnClose); 추가" 위에 mainwindow.cpp에서 일했다. 다행히 closeEvent를 다시 구현할 필요가 없었습니다. 감사! – ishmael

+0

위젯이 기본적으로 닫힐 때 삭제되지 않았다는 것을 알지 못했습니다. 도움이됩니다. 여하튼, 윈도우의 속성을 PySide 윈도우의 WA_DeleteOnClose로 설정하면 분할 오류 문제가 해결되었습니다. 이제 그 이유를 알아 내야합니다. – lightalchemist

3

당신은 아이를 가질하기로했다 모든 위젯에 closeEvent()를 오버로드 할 수 있습니다. 그런 다음 위젯 목록을 closeEvent()으로 닫거나 deleteLater를 호출하여 해당 위젯과 해당 하위 항목을 모두 삭제합니다.

+0

나는 아이들을 추적하지 않는 것이 좋습니다 것입니다. (물론 이것은 어린이가 없다면 사실이 아닙니다. 닫는 것을 좋아하지 않을 것입니다 ... 이것이 의미가있는 이유는 무엇입니까?) – IceFire

1

Leiaz는 이미 child-mainWindows의 closeEvent (.)가 호출되지 않은 이유를 지적했습니다. (.) 당신이 (창 설정을 저장 등) 거기에 무언가를하기 때문에 각 자녀에 closeEvent 전화를 closeEvent 부모 MainWindow를의 과부하를해야하는 경우,이 코드 조각 삽입 할 수 있습니다

auto childList = findChildren<QMainWindow*>(); 
for (auto child : childList) 
{ 
    child->close(); 
} 

참고 그 아이들의 QMainWindow 자식도 호출 될 것이므로 자식 - 주 윈도우의 closeEvent도 오버로드 할 필요가 없습니다. 경우 당신이 직접 아이들 만 가까운 QMainWindows 원하는 사용하는 : 당신은 단순히 closeEvent에서 QMainWindow 어린이를 찾을 수 있기 때문에

auto childList = findChildren<QMainWindow*>(QString(), Qt::FindDirectChildOnly); 
for (auto child : childList) 
{ 
    child->close(); 
} 
관련 문제