[Development] Avoiding 'random' app.quit() in QtQuick applications.

Stephen Kelly stephen.kelly at kdab.com
Fri May 18 14:01:37 CEST 2012


Hi there,

The issue raised in this thread:

http://thread.gmane.org/gmane.comp.lib.qt.user/1880

Can be simplified to this example:

    QWindow window;
    QWidget widget;

    window.show();
    widget.show();

    // This should not quit the application, because 
    // the QWindow is still open. It does quit though, which is the bug.
    QTimer::singleShot(2000, &widget, SLOT(close()));
    

Because quitOnLastWindowClosed is true by default, closing the QWidget causes 
a count of the remaining top level widgets, and if there are none visible 
left, the application quits. 

In Qt 5 we can have top-level QWindows as well as QWidgets, so we need to 
count both. Currently that is not done, but [1] fixes that.

[1] https://codereview.qt-project.org/#change,26167

The problem is that there is an existing unit test which fails when QWindows 
are also counted. The reason for that can be seen with the patch and the 
behavior in this code:


    QWidget widget;
    QPointer<QWidget> childWindow = new QWidget(&widget, Qt::Window);

    widget.show();
    childWindow->show();

    // This should quit the application, but with the patch does not. The  
    // problem is that the childWindow also has a QWindow backing it which 
    // does not get hidden as a result of the childWindow parent being closed.
    QTimer::singleShot(2000, &widget, SLOT(close()));


Before the patch, the closing of widget in this snippet would cause the loop 
in QApplication::shouldQuit to be executed, and eventually return true. Now it 
returns 'count the top-level QWindows and use that result'.

To work around this issue I created another patch [2] to close the child 
windows of a widget if that widget itself is closed. I'm not certain it's the 
right solution though. Some code out there could be relying on the existing 
behavior that one can close a Dialog without its children closing.

[2] https://codereview.qt-project.org/#change,26466

I'm looking for opinions and ideas for other ways to solve this problem. I 
think the patch at [1] should be applied. 

I'm not certain if [2] needs to be applied at all. If the parent of a 
QWidget(Qt::Window) is closed, and it is the last top-level window, is there 
any reason for the application not to quit (if quitOnLastWindowClosed is 
true)? I think it should quit, and then applying [1] would be enough.

Thanks,

-- 
Stephen Kelly <stephen.kelly at kdab.com> | Software Engineer
KDAB (Deutschland) GmbH & Co.KG, a KDAB Group Company
www.kdab.com || Germany +49-30-521325470 || Sweden (HQ) +46-563-540090
KDAB - Qt Experts - Platform-Independent Software Solutions
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 3636 bytes
Desc: not available
URL: <http://lists.qt-project.org/pipermail/development/attachments/20120518/3aa5436c/attachment.bin>


More information about the Development mailing list