我正在尝试在链中创建多个窗口:窗口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);
}
答案 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();
}