2013-02-27 212 views
4

我正在写Qt(Ubuntu 12.04上的4.8.1)应用程序,它在会话之间存储主窗口几何体。我注意到,如果widget最大化,qt不会存储它的非最大化几何。很显然,我希望我的应用程序能够返回它的非最大化大小,如果它自上次最大化以来已关闭/启动,则大小相同。在QWidget :: save/restoreGeometry如果最大化会丢失窗口大小 - 错误或功能?

  1. 主窗口未被最大化并且具有几何X;
  2. 最大化主窗口;
  3. 保存窗口几何(使用QWidget :: saveGeometry)来配置文件;
  4. 关闭我的应用程序;
  5. 重新开始;从配置文件
  6. 负载几何形状
  7. 还原(未最大化;?)步骤6窗口被最大化(如预期)

之后,但在步骤7之后,它返回到一些内部缺省大小(即,一个在QtCreator中设计表单时设置),而不是持续非最大化几何X.

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

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

回答

4

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

要获得您所需的功能,就像修改步骤如下:

  1. 主窗口没有最大化,具有几何X;
  2. 保存几何X也窗口的左上角位置为QPoint
  3. 最大化主窗口;
  4. 执行不是保存几何图形(您可以在保存到配置文件之前使用QWidget::isMaximized()来确定窗口状态是否最大化)。改为将新的isMaximised状态值保存到配置文件中。
  5. 关闭我的应用程序;
  6. 重新开始;
  7. 在打电话前window->show()应用window->resize(lastQSizeSavedinSettingsofNonMaximisedState)window->move(lastQPointSavedinSettingsofNonMaximisedState)
  8. 现在从配置检查isMaximised状态值,如果属实,只需拨打QWidget::showMaximized()否则只是QWidget::show()
  9. 现在,当你恢复窗口的大小,你应该有你想要的功能:)

使用窗口大小/状态时要记住一些事项。

当应用程序启动并且您尝试还原的值不再位于屏幕边界内时,始终提供后备几何图形和位置,以防上次保存的位置超出范围。 (这有助于解决某人更改分辨率/监视器计数/显示器位置/虚拟桌面的情况)

+0

这意味着我必须始终跟踪我的寡妇大小/位置 - 每次调整大小。第3点不是由我的代码完成的,而是由用户单击窗口栏上的最大化按钮完成的。事实上,在目前的开发阶段,我列出的所有步骤都是由用户单独激活的。无论如何 - 这不是我的问题的重点 - 我知道我的方式围绕小部件的几何形状,并控制它 - 但我认为'QWidget :: saveGeometry'的存在完全是为了摆脱我的担心 - 因为我必须写几何无论如何保存/恢复,是否意味着它没有达到目的(被窃听)? – 2013-02-27 12:56:20

+0

QWidget.cpp确实尝试使用QWidget :: restoreGeometry(...)的QByteArray参数中的windowStates恢复normalGeometry和frameGeometry。我会说如果它不起作用,提出一个QT Bug,因为在另一个bug中https://bugreports.qt-project.org/browse/QTBUG-21371最后一个但是第6个评论指示normalGeometry在去时被重置从全屏/最大化到正常状态,这在Qt 4.7中没有发生。正如我猜你知道有几个解决方法。也不知道Qt 5是否解决了它。这是Qt尝试做某事并且不正确的一个例子= bug – Viv 2013-02-27 14:28:40

0

我认为你遇到的问题来自许多可读和可设置QWidget的几何和尺寸。具体而言,您可能需要查看normalGeometry,height,width,maximumHeight,maximumWidth,minimumHeight,minimumWidth等之间的差异。

+0

我的问题在上述条款重申:'QWidget的:: saveGeometry'没有按不存储'normalGeometry'。为什么不?有没有共鸣?似乎对我有用。 (最小/最大尺寸与此无关)。 – 2013-02-27 13:00:24

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); 
+1

我明白了,并且我知道如何实现所需的结果(使用与您的解决方案类似的东西),但是整个观点是:'saveGeometry'应该将我从必需编写所有这些代码,只做本身的明显事情。我的问题是:这是一个错误,还是有这种行为背后的动机? – 2013-11-15 21:03:00