2010-12-16 44 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), ,之所以關閉是你的主窗口關閉一切退出。

關閉一個窗口小部件不會刪除它,除非屬性的Qt :: WA_DeleteOnClose設置(見QWidget::close())。如果你只是想讓你的窗戶關閉,我認爲你必須重新實現closeEvent()來調用close()方法。

但是如果你想在關閉時刪除它們,然後設置屬性的Qt :: WA_DeleteOnClose。父母被刪除時,孩子會自動刪除。

+0

這樣做伎倆!添加「w-> setAttribute(Qt :: WA_DeleteOnClose);」在上面的mainwindow.cpp中工作。很高興我不必重新實施closeEvent。謝謝! – ishmael 2010-12-16 21:33:54

+0

我不知道這個小部件在默認情況下並沒有關閉。這很有幫助。不知何故,爲我的PySide窗口設置窗口屬性爲WA_DeleteOnClose解決了分段故障問題。現在我只需要弄清楚爲什麼... – lightalchemist 2012-04-26 06:22:46

3

您可以在每一個的應該有孩子部件超負荷closeEvent()。然後,要麼讓你的小工具的列表,以關閉closeEvent(),或只調用有deleteLater,這將有問題及其子刪除這兩個部件。

+0

我建議沒有跟上孩子們的軌道,因爲你可以簡單地找到QMainWindow的孩子的closeEvent。 (當然,除非有孩子你不想關閉,否則這只是真的)爲什麼 – IceFire 2016-02-08 20:50:46

1

Leiaz已經指出了爲什麼兒童mainWindows'的closeEvent()沒有被調用。 (。)如果你需要重載父主窗口中的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(); 
}