Qt:父/子链中的多个窗口,父母不关闭孩子?

时间:2010-12-16 00:02:34

标签: windows qt parent

我正在尝试在链中创建多个窗口:窗口1是窗口2的父窗口,窗口2是窗口3的父窗口等。当我关闭一个窗口时,我希望它的所有子窗口也关闭。目前,如果我关闭顶级窗口,所有其他窗口关闭,如希望,但关闭,例如,窗口2,只关闭窗口2,而不是窗口3,等等。我应该怎么做?谢谢你的帮助!

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);
}

3 个答案:

答案 0 :(得分:17)

默认情况下,QApplication在最后一个主窗口(没有父窗口)关闭时退出(参见QApplication::lastWindowClosed signal), 这就是关闭MainWindow会关闭所有内容的原因。

关闭窗口小部件不会删除它,除非设置了属性Qt :: WA_DeleteOnClose(请参阅QWidget::close())。如果你只想让你的窗户关闭,我想你必须重新实现closeEvent()来调用孩子们的close()。

但是如果你想在关闭时删除它们,那么设置属性Qt :: WA_DeleteOnClose。删除父项时会自动删除子项。

答案 1 :(得分:3)

您可以在应该拥有子项的每个窗口小部件中重载closeEvent()。然后,要么在closeEvent()中保留要关闭的小部件列表,要么只调用deleteLater,这将删除有问题的小部件及其子节点。

答案 2 :(得分:2)

Leiaz已经指出了为什么这个孩子 - 主窗口' closeEvent(。)未被调用。如果你需要重载父mainWindow的closeEvent(。)来调用每个子节点的closeEvent,因为你在那里做了一些事情(比如存储窗口设置),你可以插入这个片段:

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

请注意,孩子们的QMainWindow孩子也会被调用,所以不需要让孩子 - 主窗口超负荷。 closeEvent也是。如果您只想关闭直接子项的QMainWindows,请使用:

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