如pyside2程序显示的窗口与qt designer中的设置不符怎么办?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如pyside2程序显示的窗口与qt designer中的设置不符怎么办?相关的知识,希望对你有一定的参考价值。

我的窗口是按照图1设计的,但编写程序调出来的窗口是图2这样的。我的电脑默认的缩放比例是200%,尝试了一下把系统的缩放比例调成100%,但这样的话我原本在qt designer中设计的布局就乱了。怎么办?
已经解决。悬赏给第一个答出正确答案的。

参考技术A 最上层Form设置布局layout 参考技术B 如pyside2程序显示的窗口与实际显示的窗口不同,与qt designer更不一样 参考技术C 这是服不服?说明是技术软件信息输入错误

Qt - pyside - saveGeometry() saveState()

【中文标题】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/…

以上是关于如pyside2程序显示的窗口与qt designer中的设置不符怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

PySide2(Qt for Python)在 Linux 上的 Qt Designer 安装在哪里?

使用 Qt Designer 在 PySide2 中实现信号/插槽时出错

使用 PySide2 开发 Maya 插件系列一:QT Designer 设计GUI, pyside-uic 把 .ui 文件转为 .py 文件

PySide2,如何拉伸 QTableWidget 以适应窗口宽度?

如何用Qt的designer添加菜单栏

如何用Qt的designer添加菜单栏