So for some weird reason my application was not closable from the Mac OS X dock – it quit properly when you selected “Quit” from the application menu or hit the Cmd-Q shortcut – but the dock menu’s quit action was completely ignored.
While debugging the issue I hooked into QApplication::notify(QObject *, QEvent *) and noted that a QCloseEvent was send to my application… wait, what? A QCloseEvent? Yes, I also thought that these kinds of events would only be send to widgets, namely, top level widgets, but I got one for my application, and Qt plainly ignored it. So I went further ahead and tried to quit the application directly when the event occured, similar to this
bool MyApp::event(QEvent * ev)
{
bool eaten = false;
switch (ev->type())
{
// other stuff ...
#ifdef Q_WS_MAC:
case QEvent::Close:
{
quit();
eaten = true;
break;
}
#endif
default:
eaten = QCoreApplication::event(ev);
break;
}
return eaten;
}
quit() slot was apparently called twice in a row. My guess is that Qt ignores the quitOnLastWindowClosed property – which I’ve set to false – and since I close all windows in the quit slot it executes quit again, or something else, so I decided to just close all open windows when the QCloseEvent arrived – without calling quit() directly, and tada, my application quitted and the slot was also only called once.
I was searching for the answer how to get the quit event for my app so I can do my close routine there and finally I found exactly what I needed. Thanks! One issue found: if you derive your class from QApplication it’s better to do QApplication::event(ev); – this will close all top level windows instead of QCoreApplication::event(ev); – this will not close any top level window.
you don’t break in case QEvent::Close, thus it calls it twice, reaching the default as well
Erm, oops, right. Damn, thank you! Correcting this in a few.