Qt - pyside - saveGeometry() saveState()

Qt - pyside - saveGeometry() saveState()

我有一个 Qt 程序,目前我使用 Qsettings.saveGeometry() 和 Qsettings.saveState() 函数来让程序恢复用户在上一个会话中设置的布局。然而,并不是所有的几何图形都被保存,只有主要的 window 而不是子元素,尤其是停靠 windows 和 table 列宽在停靠 windows.

内的浮动位置

这个线程似乎试图提供一个答案(但在 C++ 而不是 python):http://www.qtforum.org/article/38362/save-geometry-of-all-widgets-recursively.html

我在 Python 中编码,我的 C++ 不是很好,所以我不能完全按照上面的例子 link。

有谁知道这种方法是否有效?

通常可以使用 Qsettings 来存储停靠 windows 和 table 列宽的浮动位置吗?

有人可以提出基于 python/pyside 的解决方案吗?

非常感谢。

罗恩

This thread seems to attempt to provide an answer (but in C++ and not python): http://www.qtforum.org/article/38362/save-geometry-of-all-widgets-recursively.html

正如 three_pineapples 指出的那样,遍历所有小部件并不是一个好主意,因为您不想保存的东西(按钮、标签)也来自 QWidget

我建议简单地为每个浮动对象起一个有意义的名字 docked-window:

floatingWindow.setObjectName("floatingWindow")

然后您可以迭代对象名称,而不是从子对象中寻找小部件。为特定 window 创建一个 QSettings 组:

QSettings settings
# Write geometry
settings.setValue("floatingWindow/size", floatingWindow.size())
settings.setValue("floatingWindow/pos", floatingWindow.pos())
# Read geometry
floatingWindow.setSize(settings.value("floatingWindow/size").toSize())
floatingWindow.setPos(settings.value("floatingWindow/pos").toPos())

您可以使用常见的名称模式来简化此操作,例如floatingMain, floatingTools, floatingMenu.

好的伙计们。这是答案。 Qt中有一个错误。当主 window 最大化并且 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')