Hello,
i used to use this class for reliably saving and restoring an MdiSubwindow's geometry. This has been working for our purposes with PySide2. After porting to PySide6, I see that QMdiSubWindow.normalGeometry() always invalid geometries (all values are zero). Is this a bug or am I missing something obvious?
Thanks in advance
Christoph
class NexxTMdiSubWindow(QMdiSubWindow):
"""
Need subclassing for getting close / show events and saving / restoring state.
"""
"""
Need subclassing for getting close / show events and saving / restoring state.
"""
def saveGeometry(self):
"""
Saves the geometry of this subwindow (see https://bugreports.qt.io/browse/QTBUG-18648)
"""
Saves the geometry of this subwindow (see https://bugreports.qt.io/browse/QTBUG-18648)
:return: a ByteArray instance
"""
array = QByteArray()
stream = QDataStream(array, QIODevice.WriteOnly)
stream.writeUInt32(0x1D9D0CB)
stream.writeUInt16(1)
stream.writeUInt16(0)
frameGeom = self.frameGeometry()
stream.writeInt64(frameGeom.x())
stream.writeInt64(frameGeom.y())
stream.writeInt64(frameGeom.width())
stream.writeInt64(frameGeom.height())
normalGeom = self.normalGeometry()
stream.writeInt64(normalGeom.x())
stream.writeInt64(normalGeom.y())
stream.writeInt64(normalGeom.width())
stream.writeInt64(normalGeom.height())
stream.writeUInt32(int(bool(self.windowState() & Qt.WindowMaximized)))
stream.writeUInt32(int(bool(self.windowState() & Qt.WindowFullScreen)))
return array
"""
array = QByteArray()
stream = QDataStream(array, QIODevice.WriteOnly)
stream.writeUInt32(0x1D9D0CB)
stream.writeUInt16(1)
stream.writeUInt16(0)
frameGeom = self.frameGeometry()
stream.writeInt64(frameGeom.x())
stream.writeInt64(frameGeom.y())
stream.writeInt64(frameGeom.width())
stream.writeInt64(frameGeom.height())
normalGeom = self.normalGeometry()
stream.writeInt64(normalGeom.x())
stream.writeInt64(normalGeom.y())
stream.writeInt64(normalGeom.width())
stream.writeInt64(normalGeom.height())
stream.writeUInt32(int(bool(self.windowState() & Qt.WindowMaximized)))
stream.writeUInt32(int(bool(self.windowState() & Qt.WindowFullScreen)))
return array
def restoreGeometry(self, geometry):
"""
Restores the geometry of this subwindow
"""
Restores the geometry of this subwindow
:param geometry: the saved state as a QByteArray instance
:return:
"""
if geometry.size() < 4:
return False
stream = QDataStream(geometry)
if stream.readUInt32() != 0x1D9D0CB:
return False
if stream.readUInt16() != 1:
return False
stream.readUInt16() # minorVersion is ignored.
x = stream.readInt64()
y = stream.readInt64()
width = stream.readInt64()
height = stream.readInt64()
restoredFrameGeometry = QRect(x, y, width, height)
x = stream.readInt64()
y = stream.readInt64()
width = stream.readInt64()
height = stream.readInt64()
restoredNormalGeometry = QRect(x, y, width, height)
maximized = bool(stream.readUInt32())
fullScreen = bool(stream.readUInt32())
frameHeight = 20
if not restoredFrameGeometry.isValid():
restoredFrameGeometry = QRect(QPoint(0, 0), self.sizeHint())
if not restoredNormalGeometry.isValid():
restoredNormalGeometry = QRect(QPoint(0, frameHeight), self.sizeHint())
restoredFrameGeometry.moveTop(max(restoredFrameGeometry.top(), 0))
restoredNormalGeometry.moveTop(max(restoredNormalGeometry.top(), 0 + frameHeight))
if maximized or fullScreen:
self.setGeometry(restoredNormalGeometry)
ws = self.windowState()
if maximized:
ws |= Qt.WindowMaximized
if fullScreen:
ws |= Qt.WindowFullScreen
self.setWindowState(ws)
else:
offset = QPoint()
self.setWindowState(self.windowState() & ~(Qt.WindowMaximized|Qt.WindowFullScreen))
self.move(restoredFrameGeometry.topLeft() + offset)
self.resize(restoredNormalGeometry.size())
return True
:return:
"""
if geometry.size() < 4:
return False
stream = QDataStream(geometry)
if stream.readUInt32() != 0x1D9D0CB:
return False
if stream.readUInt16() != 1:
return False
stream.readUInt16() # minorVersion is ignored.
x = stream.readInt64()
y = stream.readInt64()
width = stream.readInt64()
height = stream.readInt64()
restoredFrameGeometry = QRect(x, y, width, height)
x = stream.readInt64()
y = stream.readInt64()
width = stream.readInt64()
height = stream.readInt64()
restoredNormalGeometry = QRect(x, y, width, height)
maximized = bool(stream.readUInt32())
fullScreen = bool(stream.readUInt32())
frameHeight = 20
if not restoredFrameGeometry.isValid():
restoredFrameGeometry = QRect(QPoint(0, 0), self.sizeHint())
if not restoredNormalGeometry.isValid():
restoredNormalGeometry = QRect(QPoint(0, frameHeight), self.sizeHint())
restoredFrameGeometry.moveTop(max(restoredFrameGeometry.top(), 0))
restoredNormalGeometry.moveTop(max(restoredNormalGeometry.top(), 0 + frameHeight))
if maximized or fullScreen:
self.setGeometry(restoredNormalGeometry)
ws = self.windowState()
if maximized:
ws |= Qt.WindowMaximized
if fullScreen:
ws |= Qt.WindowFullScreen
self.setWindowState(ws)
else:
offset = QPoint()
self.setWindowState(self.windowState() & ~(Qt.WindowMaximized|Qt.WindowFullScreen))
self.move(restoredFrameGeometry.topLeft() + offset)
self.resize(restoredNormalGeometry.size())
return True
_______________________________________________ PySide mailing list PySide@qt-project.org https://lists.qt-project.org/listinfo/pyside