Qt - pyside - saveGeometry() saveState()

Posted

技术标签:

【中文标题】Qt - pyside - saveGeometry() saveState()【英文标题】: 【发布时间】:2016-01-11 23:12:09 【问题描述】:

我有一个 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 的解决方案?

非常感谢。

罗恩

【问题讨论】:

您提供的链接没有实现解决方案。它只是打印出每个子部件的几何形状。他们建议将其用于确定哪些小部件需要保存。简而言之,该代码遍历主窗口的所有子窗口 (my_window.children()) 并检查子窗口是否继承自 QWidget (my_child_widget.isWidgetType())。您可以做类似的事情并为您关心的每个孩子致电my_child_widget.saveGeometry()。您可能还需要使用此方法递归检查每个孩子的孩子。 因此,您可能更容易保留对要保存的每个小部件的引用列表,然后通过调用 saveGeometry 来遍历该列表。 【参考方案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')

【讨论】:

【参考方案2】:

这个帖子似乎试图提供答案(但在 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())

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

【讨论】:

谢谢 v.much 会尝试这个并报告结果。 @Leben。感谢您的建议,但据我所知,QDockWidget 没有 .setSize()。尽管如此,我还是取得了一些进展。我已经更新了我上面的问题。如果您能再看看,我将不胜感激。 实际上这些方法似乎都不起作用。我在这里问了一个后续问题:***.com/questions/34975913/…

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

Pyside (Qt) - 如何查询信号

PySide / PyQtGraph 访问主 Qt 事件线程

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

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

使用 PySide2 在 Qt-Designer 中嵌入 PyQtGraph

Qt - pyside - saveGeometry() saveState()