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

我试图在一个链中创build多个窗口:窗口1是窗口2的父窗口,窗口2是窗口3的父窗口等。当我closures一个窗口时,我想让它的所有子窗口也closures。 目前,如果我closures顶层窗口,所有其他closures,如希望的,但closures,例如,窗口2,只closures窗口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); } 

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

关闭一个小部件不会将其删除,除非设置了属性Qt :: WA_DeleteOnClose(请参阅QWidget :: close() )。 如果你只是想要你的窗户被关闭,我想你必须重新实现closeEvent()来调用close()方法。

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

你可以在每个应该有孩子的小部件中重载closeEvent() 。 然后,保持你的小部件的列表在closeEvent()中关闭,或者只是在那里调用deleteLater,这会删除有问题的widget和它的子项。

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

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

请注意,孩子的QMainWindow孩子也会被调用,所以也不需要重载child-mainWindows的closeEvent。 如果你只想关闭QMainWindows直接的孩子,使用:

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