Qt - pyside - saveGeometry() saveState()

4
我有一个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的解决方案吗?
谢谢。
Ron

您提供的链接并未实现解决方案,仅会打印出每个子窗口部件的几何形状。他们建议使用此方法来确定哪些窗口部件需要保存。简而言之,该代码会迭代主窗口 (my_window.children()) 的所有子窗口,并检查该子窗口是否继承自 QWidget (my_child_widget.isWidgetType())。您可以采用类似的方法,并为您关心的每个子窗口调用 my_child_widget.saveGeometry()。您可能还需要使用此方法递归地检查每个子窗口的子窗口。 - three_pineapples
因此,对于您要保存的每个小部件,只需保留一个引用列表,并在该列表上进行迭代,调用 saveGeometry 可能会更容易。 - three_pineapples
2个回答

2

好的,大家好。这里是答案。Qt中存在一个bug。当主窗口最大化且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')

1

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

正如three_pineapples所指出的,遍历所有小部件并不是一个好主意,因为您不想保存的东西(按钮、标签)也是从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())

您可以使用常见的命名模式来简化此过程,例如floatingMainfloatingToolsfloatingMenu


非常感谢,我会尝试并回报结果。 - Ron
@ Leben。感谢您的建议,但据我所知,QDockWidget没有.setSize()方法。尽管如此,我已经取得了一些进展。我已经更新了我的问题,请您再过来看看。谢谢。 - Ron
实际上,这些方法似乎都不起作用。我在这里提出了一个后续问题:http://stackoverflow.com/questions/34975913/qt-pyside-savegeom-savestate-again - Ron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接