4

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

  1. 主窗口未最大化且具有几何 X;
  2. 最大化主窗口;
  3. 保存窗口几何图形(使用 QWidget::saveGeometry)到配置文件;
  4. 关闭我的申请;
  5. 重新开始;
  6. 从配置文件加载几何
  7. 恢复(取消最大化?;)

在步骤 6 之后窗口最大化(如预期的那样),但在步骤 7 之后它返回到某个内部默认大小(即在 QtCreator 中设计表单时设置的一组),而不是最后一个未最大化的几何 X。

这是期望的行为吗?或者在 qt 中实现是不可能/困难的?

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

4

3 回答 3

4

当窗口最大化开始时,您不需要保存几何图形。

要获得所需的功能,只需按如下方式修改您的步骤:

  1. 主窗口未最大化且具有几何 X;
  2. 将几何 X 也保存为窗口的左上角为QPointY
  3. 最大化主窗口;
  4. 不要保存几何图形(您可以在保存到配置文件之前计算窗口状态是否最大化QWidget::isMaximized()。将新的isMaximised状态值保存到配置文件中。
  5. 关闭我的申请;
  6. 重新开始;
  7. 在你打电话之前window->show()申请一个window->resize(lastQSizeSavedinSettingsofNonMaximisedState)和一个window->move(lastQPointSavedinSettingsofNonMaximisedState)
  8. 现在检查isMaximised配置中的状态值,如果为真,只需调用QWidget::showMaximized()否则只是QWidget::show()
  9. 现在,当您恢复窗口大小时,您应该拥有所需的功能:)

处理窗口大小/状态时要记住的事情。

始终提供备用几何和位置,以防应用程序启动时最后保存的位置超出范围,并且您尝试恢复的值不再位于屏幕范围内。(这有助于满足某人更改分辨率/显示器计数/显示器位置/虚拟桌面的情况)

于 2013-02-27T12:39:05.180 回答
1
4. 不要保存几何图形(您可以在保存到配置文件之前使用 QWidget::isMaximized() 计算窗口状态是否最大化)。将新的 isMaximized 状态值保存到配置文件中。

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

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

写设置:

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

读取设置:

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);
于 2013-11-15T09:05:46.247 回答
0

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

于 2013-02-27T12:26:33.683 回答