diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 70249785e2c..034e2c9e978 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -6747,12 +6747,25 @@ bool QWidget::restoreGeometry(const QByteArray &geometry) if (maximized || fullScreen) { // set geometry before setting the window state to make // sure the window is maximized to the right screen. - // Skip on windows: the window is restored into a broken - // half-maximized state. + Qt::WindowStates ws = windowState(); #ifndef Q_OS_WIN setGeometry(restoredNormalGeometry); -#endif - Qt::WindowStates ws = windowState(); +#else + if (ws & Qt::WindowFullScreen) { + // Full screen is not a real window state on Windows. + move(availableGeometry.topLeft()); + } else if (ws & Qt::WindowMaximized) { + // Setting a geometry on an already maximized window causes this to be + // restored into a broken, half-maximized state, non-resizable state (QTBUG-4397). + // Move the window in normal state if needed. + if (restoredScreenNumber != desktop->screenNumber(this)) { + setWindowState(Qt::WindowNoState); + setGeometry(restoredNormalGeometry); + } + } else { + setGeometry(restoredNormalGeometry); + } +#endif // Q_OS_WIN if (maximized) ws |= Qt::WindowMaximized; if (fullScreen)