我正在编写Qt(在Ubuntu 12.04上为4.8.1)应用程序,它在会话之间存储它的主窗口几何。我注意到如果小部件最大化,qt不存储它的非最大化几何。显然我希望我的应用程序返回到它的非最大化大小,如果它自上次最大化后关闭/启动那么相同。在
在第6步之后窗口被最大化(如预期的那样),但是在第7步之后它返回到一些内部默认大小(即在QtCreator中设计表单时设置一个),而不是持续非最大化的几何X.
这是理想的行为吗?或者在qt内部实施是不是也不可能?
是因为当最大化时,窗口管理器而不是qt(至少在linux上)会记住非最大化的大小?
答案 0 :(得分:4)
当窗口最大化时,您不需要保存几何体。
要获得所需的功能,只需按以下步骤修改步骤:
QPoint
Y QWidget::isMaximized()
计算窗口状态是否最大化)。将新的isMaximised
状态值保存到配置文件中。window->show()
之前,请先申请window->resize(lastQSizeSavedinSettingsofNonMaximisedState)
和window->move(lastQPointSavedinSettingsofNonMaximisedState)
isMaximised
州值,如果为真,则只需拨打QWidget::showMaximized(),只需QWidget::show()
使用窗口大小/状态时要记住的事项。
始终提供后备几何体和位置,以便在启动应用程序时最后保存的位置超出范围,并且您尝试恢复的值不再在屏幕边界内。 (这有助于迎合有人更改分辨率/监视器数量/监视位置/虚拟桌面的情况)
答案 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);