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 / PyQtGraph 访问主 Qt 事件线程
模型中 dropActions 的访问值 (PySide/PyQt/Qt)