Close popups when switching applications on Windows.

Bring back code from 4.8 (Note that ALT-TAB is not received
as key event).

Task-number: QTBUG-27146
Change-Id: I6dd2e9c88fdc4c89d26dfaa8ab47deb2be451f25
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Reviewed-by: Qt Doc Bot <qt_docbot@qt-project.org>
Reviewed-by: Jørgen Lind <jorgen.lind@nokia.com>
This commit is contained in:
Friedemann Kleint 2012-09-07 13:42:02 +02:00 committed by Qt by Nokia
parent aab15782e2
commit f957370206
2 changed files with 28 additions and 2 deletions

View File

@ -2934,6 +2934,16 @@ bool QApplicationPrivate::shouldQuit()
return QGuiApplicationPrivate::shouldQuit(); return QGuiApplicationPrivate::shouldQuit();
} }
static inline void closeAllPopups()
{
// Close all popups: In case some popup refuses to close,
// we give up after 1024 attempts (to avoid an infinite loop).
int maxiter = 1024;
QWidget *popup;
while ((popup = QApplication::activePopupWidget()) && maxiter--)
popup->close();
}
/*! \reimp /*! \reimp
*/ */
bool QApplication::notify(QObject *receiver, QEvent *e) bool QApplication::notify(QObject *receiver, QEvent *e)
@ -3006,9 +3016,13 @@ bool QApplication::notify(QObject *receiver, QEvent *e)
} }
#endif // QT_NO_GESTURES #endif // QT_NO_GESTURES
// User input and window activation makes tooltips sleep
switch (e->type()) { switch (e->type()) {
case QEvent::Wheel: case QEvent::ApplicationDeactivate:
// Close all popups (triggers when switching applications
// by pressing ALT-TAB on Windows, which is not receive as key event.
closeAllPopups();
break;
case QEvent::Wheel: // User input and window activation makes tooltips sleep
case QEvent::ActivationChange: case QEvent::ActivationChange:
case QEvent::KeyPress: case QEvent::KeyPress:
case QEvent::KeyRelease: case QEvent::KeyRelease:

View File

@ -5305,6 +5305,7 @@ void tst_QWidget::setCursor()
QWidget child(&window); QWidget child(&window);
window.show(); window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window));
window.setCursor(Qt::WaitCursor); window.setCursor(Qt::WaitCursor);
QVERIFY(window.testAttribute(Qt::WA_SetCursor)); QVERIFY(window.testAttribute(Qt::WA_SetCursor));
QVERIFY(!child.testAttribute(Qt::WA_SetCursor)); QVERIFY(!child.testAttribute(Qt::WA_SetCursor));
@ -5375,6 +5376,15 @@ void tst_QWidget::setCursor()
void tst_QWidget::setToolTip() void tst_QWidget::setToolTip()
{ {
QWidget widget; QWidget widget;
widget.resize(200, 200);
// Showing the widget is not required for the tooltip event count test
// to work. It should just prevent the application from becoming inactive
// which would cause it to close all popups, interfering with the test
// in the loop below.
widget.setObjectName(QLatin1String("tst_qwidget setToolTip"));
widget.setWindowTitle(widget.objectName());
widget.show();
QVERIFY(QTest::qWaitForWindowExposed(&widget));
EventSpy spy(&widget, QEvent::ToolTipChange); EventSpy spy(&widget, QEvent::ToolTipChange);
QCOMPARE(spy.count(), 0); QCOMPARE(spy.count(), 0);
@ -5390,6 +5400,8 @@ void tst_QWidget::setToolTip()
#ifndef Q_OS_WINCE_WM #ifndef Q_OS_WINCE_WM
for (int pass = 0; pass < 2; ++pass) { for (int pass = 0; pass < 2; ++pass) {
QScopedPointer<QWidget> popup(new QWidget(0, Qt::Popup)); QScopedPointer<QWidget> popup(new QWidget(0, Qt::Popup));
popup->setObjectName(QString::fromLatin1("tst_qwidget setToolTip #%1").arg(pass));
popup->setWindowTitle(popup->objectName());
popup->resize(150, 50); popup->resize(150, 50);
QFrame *frame = new QFrame(popup.data()); QFrame *frame = new QFrame(popup.data());
frame->setGeometry(0, 0, 50, 50); frame->setGeometry(0, 0, 50, 50);