如果最大化QWidget :: save / restoreGeometry会丢失窗口大小 - 错误或功能?

时间:2013-02-27 12:09:21

标签: qt window geometry

我正在编写Qt(在Ubuntu 12.04上为4.8.1)应用程序,它在会话之间存储它的主窗口几何。我注意到如果小部件最大化,qt不存储它的非最大化几何。显然我希望我的应用程序返回到它的非最大化大小,如果它自上次最大化后关闭/启动那么相同。在

  1. 主窗口未最大化且具有几何X;
  2. 最大化主窗口;
  3. 将窗口几何(使用QWidget :: saveGeometry)保存到配置文件;
  4. 关闭我的申请;
  5. 再次开始;
  6. 从配置文件加载几何
  7. 恢复(取消最大化?;)
  8. 在第6步之后窗口被最大化(如预期的那样),但是在第7步之后它返回到一些内部默认大小(即在QtCreator中设计表单时设置一个),而不是持续非最大化的几何X.

    这是理想的行为吗?或者在qt内部实施是不是也不可能?

    是因为当最大化时,窗口管理器而不是qt(至少在linux上)会记住非最大化的大小?

3 个答案:

答案 0 :(得分:4)

当窗口最大化时,您不需要保存几何体。

要获得所需的功能,只需按以下步骤修改步骤:

  1. 主窗口未最大化且具有几何X;
  2. 保存几何X还将窗口的左上角位置设为QPoint Y
  3. 最大化主窗口;
  4. 保存几何图形(您可以在保存到配置文件之前使用QWidget::isMaximized()计算窗口状态是否最大化)。将新的isMaximised状态值保存到配置文件中。
  5. 关闭我的申请;
  6. 再次开始;
  7. 致电window->show()之前,请先申请window->resize(lastQSizeSavedinSettingsofNonMaximisedState)window->move(lastQPointSavedinSettingsofNonMaximisedState)
  8. 现在检查来自配置的isMaximised州值,如果为真,则只需拨打QWidget::showMaximized(),只需QWidget::show()
  9. 现在,当您恢复窗口大小时,您应该拥有所需的功能:)
  10. 使用窗口大小/状态时要记住的事项。

    始终提供后备几何体和位置,以便在启动应用程序时最后保存的位置超出范围,并且您尝试恢复的值不再在屏幕边界内。 (这有助于迎合有人更改分辨率/监视器数量/监视位置/虚拟桌面的情况)

答案 1 :(得分:0)

我认为您遇到的问题来自于QWidget可读和可设置的多种几何和大小。具体来说,您可能希望查看normalGeometry,height,width,maximumHeight,maximumWidth,minimumHeight,minimumWidth等之间的差异。

答案 2 :(得分:0)

4。不要保存几何图形(您可以在保存到配置文件之前使用QWidget :: isMaximized()来确定窗口状态是否最大化)。将新的isMaximised状态值保存到配置文件中。

这里的另一个问题是:窗口不仅会根据其在屏幕上的位置而最大化/最小化,而是基于窗口的大部分位置。如果窗口的80%位于屏幕1上,但左上角位于屏幕2上,则最大化窗口将显示在屏幕1上。

不过,你的想法是最好的。经过一个多小时的谷歌(使用QT5),我现在使用:

writeSettings:

settings.setValue("pos", pos());
if(!isMaximized())
    settings.setValue("size", size());
settings.setValue("maximized", isMaximized());

readSettings:

if(settings.contains("pos"))
    move(settings.value("pos").toPoint());
if(settings.contains("size"))
    resize(settings.value("size").toSize());

if(settings.value("maximized").toBool())
    setWindowState(windowState() | Qt::WindowMaximized);