Restoring a Window's Geometry

本文档介绍如何使用几何属性保存和恢复 窗口的 geometry. 在 Windows 上, 这基本上是存储 QWindow::geometry() 的结果, 并在调用 show() 之前, 在下一个会话中调用 QWindow::setGeometry().

在 X11 上, 这可能不起作用, 因为不可见窗口还没有边框. 窗口管理器稍后装饰窗口. 发生这种情况时, 窗口会根据装饰框的大小向屏幕的右下角移动. 尽管 X 提供了避免这种转变的方法, 但一些窗口管理器未能实现此功能.

使用 Qt Widgets 时, Qt 提供了为你保存和恢复 widget 窗口的几何形状和状态的函数. QWidget::saveGeometry() 保存窗口的几何形状和最大化/全屏状态, 而 QWidget::restoreGeometry() 恢复它. 恢复功能还会检查恢复的几何图形是否在屏幕几何图形之外, 如果是, 则进行适当的修改:


  void MyMainWindow::closeEvent(QCloseEvent *event)
  {
      QSettings settings("MyCompany", "MyApp");
      settings.setValue("geometry", saveGeometry());
      settings.setValue("windowState", saveState());
      QMainWindow::closeEvent(event);
  }
  void MainWindow::readSettings()
  {
      QSettings settings("MyCompany", "MyApp");
      restoreGeometry(settings.value("myWidget/geometry").toByteArray());
      restoreState(settings.value("myWidget/windowState").toByteArray());
  }

另一个解决方案是存储 pos()size(), 在调用 show() 之前, 调用 QWidget::resize() 和 move() 恢复几何形状, 如 Application 示例所示.