Qt - Pyside - .saveGeom() .saveState() (再次)

Posted

技术标签:

【中文标题】Qt - Pyside - .saveGeom() .saveState() (再次)【英文标题】:Qt - Pyside - .saveGeom() .saveState() (again) 【发布时间】:2016-01-24 12:42:16 【问题描述】:

这是Qt - pyside - saveGeometry() saveState()的后续问题

我有一个 Qt 程序,目前我使用 Qsettings 以及 mainWindow.saveGeometry() 和 mainWindow.saveState() 函数来允许程序恢复用户在上一个会话中设置的布局。

这种方法适用于所有停靠窗口的停靠位置。如果窗口在退出时未停靠,它也适用于未停靠窗口的浮动位置。

当用户在会话中根据他们的需要定制浮动窗口的位置时,停靠和重新浮动窗口会使其成功恢复用户的首选位置。

但是,当用户调整了窗口的大小和位置,然后停靠窗口然后退出时,就会出现问题。重新启动时,窗口不会恢复用户首选的浮动位置。

上面链接的其他问题的答案中的任何建议都没有帮助,因为 QdockWidget 没有任何 getGeom() setGeom() 类型的方法。它也没有自己的 seveGeometry() restoreGeometry() 方法。我猜主窗口方法也应该处理停靠小部件。但上述行为达不到预期的功能。

我尝试在 QdockWidget 的 widget() 方法返回的对象上使用 save 和 restore 方法,但这不起作用。 (修改的是QdockWidget的内容,而不是浮动窗口的位置)

所以我认为我提炼的问题是: 1)其他人是否观察到主窗口保存/恢复的上述缺点,或者我可能正在做一些事情来阻止停靠窗口的正确恢复。 2) 有没有办法获取和设置QdockWidget的浮动几何体?

【问题讨论】:

我想我可能会看到类似的问题,我看到当mainWindow 在关闭时最大化时,停靠的小部件的大小没有保持它们的宽度,当它没有最大化时,然后它保存+恢复用户大小。当它最大化时,似乎只有在尺寸小于一定尺寸时才保存/恢复尺寸? 【参考方案1】:

好的,伙计们。这是答案。 Qt 中有一个错误。当主窗口最大化并且 QdocWidget 停靠(非浮动)时,浮动位置不会被保存。

此代码是一个简单的解决方法。

保存:

settings = QtCore.QSettings(org_name, app_name)
is_floating = main_win._ui.dockWin.isFloating()
settings.setValue('dockWin/isFloating', is_floating)
main_win._ui.dockWin.setFloating(True)
settings.setValue('geometry', main_win.saveGeometry())
settings.setValue('state', main_win.saveState())

恢复:

settings = QtCore.QSettings(org_name, app_name)
main_win.restoreGeometry(settings.value('geometry'))
main_win.restoreState(settings.value('state'))
main_win._ui.dockWin.setFloating(settings.value('dockWin/isFloating')=='true')

【讨论】:

以上是关于Qt - Pyside - .saveGeom() .saveState() (再次)的主要内容,如果未能解决你的问题,请参考以下文章

Pyside (Qt) - 如何查询信号

PySide / PyQtGraph 访问主 Qt 事件线程

模型中 dropActions 的访问值 (PySide/PyQt/Qt)

PySide (Qt) 信号未到达我的插槽

使用 PySide2 在 Qt-Designer 中嵌入 PyQtGraph

Qt - pyside - saveGeometry() saveState()