Window maximised state not retained over close
-
My application saves the geometry and state in my closeEvent handler:
QSettings settings; settings.beginGroup("MainWindow"); auto geometry{ saveGeometry() }; settings.setValue("geometry", geometry); #ifndef NDEBUG ZTRACE_RUNTIME("Hex dump of geometry:"); ZTrace::dumpHex(geometry.constData(), geometry.length()); #endif auto windowState{ saveState()}; settings.setValue("windowState", saveState()); #ifndef NDEBUG ZTRACE_RUNTIME("Hex dump of windowState:"); ZTrace::dumpHex(windowState.constData(), windowState.length()); #endif settings.endGroup();When I reopen the application I do this in the main window startup code:
QSettings settings; settings.beginGroup("MainWindow"); auto geometry{ settings.value("geometry", QByteArray()).toByteArray() }; auto windowState{ settings.value("windowState", QByteArray()).toByteArray() }; #ifndef NDEBUG if (geometry.length()) { ZTRACE_RUNTIME("Hex dump of geometry:"); ZTrace::dumpHex(geometry.constData(), geometry.length()); } if (windowState.length()) { ZTRACE_RUNTIME("Hex dump of windowState:"); ZTrace::dumpHex(windowState.constData(), windowState.length()); } #endif restoreGeometry(geometry); restoreState(windowState); settings.endGroup();This works most of the time, but if I maximise the application and then close it the window opens at the top left of the desktop with a relatively small size (1152 x 698) rather than maximised.
What am I doing wrong please. I am sure it used to work on Qt 6.4.0 (this is 6.5.1)
The hex dump of the window geometry and state at close time was:
00000041 2023/10/04 04:18:39.307 050688 000023e8 >Hex dump of geometry: 00000042 2023/10/04 04:18:39.307 050688 000023e8 >0000000003822760: 01D9D0CB 00030000 00000000 FFFFFFF9 ................ 00000043 2023/10/04 04:18:39.307 050688 000023e8 >0000000003822770: 00000398 0000022C 00000000 00000017 .......,........ 00000044 2023/10/04 04:18:39.307 050688 000023e8 >0000000003822780: 00000398 0000022C 00000000 00000000 .......,........ 00000045 2023/10/04 04:18:39.307 050688 000023e8 >0000000003822790: 0C000000 00000000 00170000 03980000 ................ 00000046 2023/10/04 04:18:39.308 050688 000023e8 >00000000038227A0: 022C ., 00000047 2023/10/04 04:18:39.308 050688 000023e8 >Hex dump of windowState: 00000048 2023/10/04 04:18:39.308 050688 000023e8 >0000000003737FF0: 000000FF 00000000 FD000000 02000000 ................ 00000049 2023/10/04 04:18:39.308 050688 000023e8 >0000000003738000: 00000001 22000002 00FC0200 000001FB ...."........... 00000050 2023/10/04 04:18:39.308 050688 000023e8 >0000000003738010: 00000016 00450078 0070006C 006F0072 .....E.x.p.l.o.r 00000051 2023/10/04 04:18:39.309 050688 000023e8 >0000000003738020: 00650072 00420061 00720100 00000000 .e.r.B.a.r...... 00000052 2023/10/04 04:18:39.309 050688 000023e8 >0000000003738030: 00020000 0001C600 07FFFF00 00000300 ................ 00000053 2023/10/04 04:18:39.309 050688 000023e8 >0000000003738040: 00027100 00009CFC 01000000 01FB0000 ..q............. 00000054 2023/10/04 04:18:39.309 050688 000023e8 >0000000003738050: 00160050 00690063 00740075 00720065 ...P.i.c.t.u.r.e 00000055 2023/10/04 04:18:39.310 050688 000023e8 >0000000003738060: 004C0069 00730074 01000001 28000002 .L.i.s.t....(... 00000056 2023/10/04 04:18:39.310 050688 000023e8 >0000000003738070: 71000002 7100FFFF FF000002 71000001 q...q.......q... 00000057 2023/10/04 04:18:39.310 050688 000023e8 >0000000003738080: 5E000000 01000000 04000000 01000000 ^............... 00000058 2023/10/04 04:18:39.310 050688 000023e8 >0000000003738090: 08FC0000 0000 -
My application saves the geometry and state in my closeEvent handler:
QSettings settings; settings.beginGroup("MainWindow"); auto geometry{ saveGeometry() }; settings.setValue("geometry", geometry); #ifndef NDEBUG ZTRACE_RUNTIME("Hex dump of geometry:"); ZTrace::dumpHex(geometry.constData(), geometry.length()); #endif auto windowState{ saveState()}; settings.setValue("windowState", saveState()); #ifndef NDEBUG ZTRACE_RUNTIME("Hex dump of windowState:"); ZTrace::dumpHex(windowState.constData(), windowState.length()); #endif settings.endGroup();When I reopen the application I do this in the main window startup code:
QSettings settings; settings.beginGroup("MainWindow"); auto geometry{ settings.value("geometry", QByteArray()).toByteArray() }; auto windowState{ settings.value("windowState", QByteArray()).toByteArray() }; #ifndef NDEBUG if (geometry.length()) { ZTRACE_RUNTIME("Hex dump of geometry:"); ZTrace::dumpHex(geometry.constData(), geometry.length()); } if (windowState.length()) { ZTRACE_RUNTIME("Hex dump of windowState:"); ZTrace::dumpHex(windowState.constData(), windowState.length()); } #endif restoreGeometry(geometry); restoreState(windowState); settings.endGroup();This works most of the time, but if I maximise the application and then close it the window opens at the top left of the desktop with a relatively small size (1152 x 698) rather than maximised.
What am I doing wrong please. I am sure it used to work on Qt 6.4.0 (this is 6.5.1)
The hex dump of the window geometry and state at close time was:
00000041 2023/10/04 04:18:39.307 050688 000023e8 >Hex dump of geometry: 00000042 2023/10/04 04:18:39.307 050688 000023e8 >0000000003822760: 01D9D0CB 00030000 00000000 FFFFFFF9 ................ 00000043 2023/10/04 04:18:39.307 050688 000023e8 >0000000003822770: 00000398 0000022C 00000000 00000017 .......,........ 00000044 2023/10/04 04:18:39.307 050688 000023e8 >0000000003822780: 00000398 0000022C 00000000 00000000 .......,........ 00000045 2023/10/04 04:18:39.307 050688 000023e8 >0000000003822790: 0C000000 00000000 00170000 03980000 ................ 00000046 2023/10/04 04:18:39.308 050688 000023e8 >00000000038227A0: 022C ., 00000047 2023/10/04 04:18:39.308 050688 000023e8 >Hex dump of windowState: 00000048 2023/10/04 04:18:39.308 050688 000023e8 >0000000003737FF0: 000000FF 00000000 FD000000 02000000 ................ 00000049 2023/10/04 04:18:39.308 050688 000023e8 >0000000003738000: 00000001 22000002 00FC0200 000001FB ...."........... 00000050 2023/10/04 04:18:39.308 050688 000023e8 >0000000003738010: 00000016 00450078 0070006C 006F0072 .....E.x.p.l.o.r 00000051 2023/10/04 04:18:39.309 050688 000023e8 >0000000003738020: 00650072 00420061 00720100 00000000 .e.r.B.a.r...... 00000052 2023/10/04 04:18:39.309 050688 000023e8 >0000000003738030: 00020000 0001C600 07FFFF00 00000300 ................ 00000053 2023/10/04 04:18:39.309 050688 000023e8 >0000000003738040: 00027100 00009CFC 01000000 01FB0000 ..q............. 00000054 2023/10/04 04:18:39.309 050688 000023e8 >0000000003738050: 00160050 00690063 00740075 00720065 ...P.i.c.t.u.r.e 00000055 2023/10/04 04:18:39.310 050688 000023e8 >0000000003738060: 004C0069 00730074 01000001 28000002 .L.i.s.t....(... 00000056 2023/10/04 04:18:39.310 050688 000023e8 >0000000003738070: 71000002 7100FFFF FF000002 71000001 q...q.......q... 00000057 2023/10/04 04:18:39.310 050688 000023e8 >0000000003738080: 5E000000 01000000 04000000 01000000 ^............... 00000058 2023/10/04 04:18:39.310 050688 000023e8 >0000000003738090: 08FC0000 0000What OS are you using?
Note this from here:
On X11, this might not work because an invisible window does not have a frame yet. The window manager will decorate the window later. When this happens, the window shifts towards the bottom/right corner of the screen depending on the size of the decoration frame. Although X provides a way to avoid this shift, some window managers fail to implement this feature.
In addion, it seems that there are a lot of bugs when trying to restore geometry from settings. There are also some workarounds
-
P Perdrix has marked this topic as solved on