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