Fix QCompleter popups preventing the application from exiting

Due to an implementation detail regarding setParent() and
setWindowFlags(), if a QCompleter popup ends up being the last open
window after closing the main window, the application would be
prevented from exiting even after selecting an item in the popup.

This is due to adjustQuitOnCloseAttribute() not being called when
passing a Qt::Popup flag to setParent(parent, windowFlags).

Use setWindowFlags() directly, which adjusts the quit on close
attribute, and allows an application to exit properly.

Change-Id: Ic4cff9504df268556d851e40d5ae08b7ed4dc3bf
Fixes: QTBUG-69924
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
Alexandru Croitor 2018-09-25 18:35:31 +02:00
parent f99e956d65
commit 5e64957ee4

View File

@ -1233,7 +1233,14 @@ void QCompleter::setPopup(QAbstractItemView *popup)
Qt::FocusPolicy origPolicy = Qt::NoFocus;
if (d->widget)
origPolicy = d->widget->focusPolicy();
popup->setParent(0, Qt::Popup);
// Mark the widget window as a popup, so that if the last non-popup window is closed by the
// user, the application should not be prevented from exiting. It needs to be set explicitly via
// setWindowFlag(), because passing the flag via setParent(parent, windowFlags) does not call
// QWidgetPrivate::adjustQuitOnCloseAttribute(), and causes an application not to exit if the
// popup ends up being the last window.
popup->setParent(nullptr);
popup->setWindowFlag(Qt::Popup);
popup->setFocusPolicy(Qt::NoFocus);
if (d->widget)
d->widget->setFocusPolicy(origPolicy);