app.setQuitOnLastWindowClosed(true);
QT助手上这么写
主窗口设置属性Qt::WA_QuitOnClose
w.setAttribute(Qt::WA_QuitOnClose,true);
其他窗口XX.setAttribute(Qt::WA_QuitOnClose,false);
这样关闭主窗口的时候,主程序就会退出,其他窗口也会关闭。
void QApplication::setQuitOnLastWindowClosed(bool quit)
{
QApplicationPrivate::quitOnLastWindowClosed = quit;
}
setQuitOnLastWindowClosed(bool quit)函数也就是设置了一下然后QApplicationPrivate::quitOnLastWindowClosed这个值.
void QApplicationPrivate::emitLastWindowClosed()
{
if (qApp && qApp->d_func()->in_exec) {
if (QApplicationPrivate::quitOnLastWindowClosed) {
// get ready to quit, this event might be removed if the
// event loop is re-entered, however
QApplication::postEvent(qApp, new QEvent(QEvent::Quit));
}
emit qApp->lastWindowClosed();
}
}
emit qApp->lastWindowClosed();所以两种方法其实是一样滴.
主窗口设置属性Qt::WA_QuitOnClose
w.setAttribute(Qt::WA_QuitOnClose,true);
Qt::WA_QuitOnClose属性是使窗口如果是最后一个关闭的时候触发事件lastWindowClosed();
然后主程序收到事件退出
a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
现在问题是自己定义的子窗口打开的时候,它们默认Qt::WA_QuitOnClose也是true,所以如果主窗口关闭的时候有别的窗口开着,(除了一些暂时性的窗口——如启动界面、工具窗口、弹出菜单)程序还是不会退出,而是等到最后一个窗口关闭之后才退出。
所以现在要把别的窗口的Qt::WA_QuitOnClose设为false。
XX.setAttribute(Qt::WA_QuitOnClose,false);
这样关闭主窗口的时候,主程序就会退出,其他窗口也会关闭。
qt助手中的解释:
This signal is emitted from QApplication::exec() when the last visible primary window (i.e. window with no parent) with the Qt::WA_QuitOnClose attribute set is closed.
By default,
This feature can be turned off by setting quitOnLastWindowClosed to false.