2

我有一个 Qt 程序,目前我使用 Qsettings.saveGeometry() 和 Qsettings.saveState() 函数来允许程序恢复用户在上一个会话中设置的布局。然而,并非所有几何图形都被保存,只有主窗口而不是子窗口,特别是停靠窗口的浮动位置和停靠窗口内的表格列宽。

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

我正在用 Python 编码,而我的 C++ 不是很好,所以我不能完全按照上面链接中的示例进行操作。

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

一般来说,是否可以使用 Qsettings 来存储停靠窗口的浮动位置和表格列宽?

任何人都可以建议一个基于 python/pyside 的解决方案吗?

非常感谢。

罗恩

4

2 回答 2

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')
于 2016-01-24T17:33:33.607 回答
0

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

正如three_pineapples 指出的那样,遍历所有小部件并不是一个好主意,因为您不想保存的东西, (buttons, label) 也是从QWidget.

我建议为每个浮动停靠窗口简单地赋予有意义的名称:

floatingWindow.setObjectName("floatingWindow")

然后,您可以迭代对象名称,而不是从子对象中寻找小部件。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

于 2016-01-12T09:52:45.723 回答