【问题标题】:How do I store the window size between sessions in Qt?如何在 Qt 中存储会话之间的窗口大小?
【发布时间】:2010-09-09 15:15:27
【问题描述】:

我在 Qt 应用程序中有一个 QMainWindow。当我关闭它时,我希望它存储其当前的还原大小(未最大化时的窗口大小)。当我以恢复模式(即未最大化)关闭窗口时,这很有效。但是,如果我在窗口最大化时关闭窗口,那么下次我启动应用程序并恢复应用程序(因为它以最大化模式启动)时,它就不会记住它应该恢复到的大小。有没有办法做到这一点?

【问题讨论】:

    标签: qt window size restore


    【解决方案1】:

    使用QWidget::saveGeometry 功能将当前设置写入注册表。(使用QSettings 访问注册表)。然后在启动时使用 restoreGeometry() 恢复到之前的状态。

    【讨论】:

    • 如果你还想保存dockwidgets的位置和状态,而不仅仅是大小,你应该使用QWidget::saveState()
    • 不幸的是,这种方式不适用于在第二台显示器上有最大化窗口的情况(至少在 Windows 7 中)。恢复后的几何图形使第一台显示器上的窗口最大化。我使用类似于 iforce2d 的答案的方法来解决这个问题。
    • 注意:没有QWidget::saveState()了。至少,它不在 Qt 4.8 或 5.7 中。 saveState() 似乎只出现在 QMainWindow 上。
    【解决方案2】:

    http://qt-project.org/doc/qt-4.8/application-windows.html 处的图像显示,geometry.x()geometry.y() 不等于 x()y(),它们与 pos() 相同。

    就我而言,我使用:

    x()
    y()
    width()
    height()
    

    并成功恢复这些:

    move()
    resize()
    

    【讨论】:

      【解决方案3】:

      我发现在 Fedora 14 上需要结合前面的所有答案。小心不要在窗口最大化时保存大小和位置!

      void MainWindow::writePositionSettings()
      {
          QSettings qsettings( "iforce2d", "killerapp" );
      
          qsettings.beginGroup( "mainwindow" );
      
          qsettings.setValue( "geometry", saveGeometry() );
          qsettings.setValue( "savestate", saveState() );
          qsettings.setValue( "maximized", isMaximized() );
          if ( !isMaximized() ) {
              qsettings.setValue( "pos", pos() );
              qsettings.setValue( "size", size() );
          }
      
          qsettings.endGroup();
      }
      
      void MainWindow::readPositionSettings()
      {
          QSettings qsettings( "iforce2d", "killerapp" );
      
          qsettings.beginGroup( "mainwindow" );
      
          restoreGeometry(qsettings.value( "geometry", saveGeometry() ).toByteArray());
          restoreState(qsettings.value( "savestate", saveState() ).toByteArray());
          move(qsettings.value( "pos", pos() ).toPoint());
          resize(qsettings.value( "size", size() ).toSize());
          if ( qsettings.value( "maximized", isMaximized() ).toBool() )
              showMaximized();
      
          qsettings.endGroup();
      }
      

      在 main() 中,位置设置在第一次显示窗口之前被读取...

      MainWindow mainWindow;
      mainWindow.readPositionSettings();
      mainWindow.show();
      

      ...这些事件处理程序会根据需要更新设置。 (这会导致在移动和调整大小期间每次鼠标移动都会写入设置文件,这是不理想的。)

      void MainWindow::moveEvent( QMoveEvent* )
      {
          writePositionSettings();
      }
      
      void MainWindow::resizeEvent( QResizeEvent* )
      {
          writePositionSettings();
      }
      
      void MainWindow::closeEvent( QCloseEvent* )
      {
          writePositionSettings();
      }
      

      仍然,位置的垂直分量不太正确,它似乎忽略了窗口标题栏的高度......如果有人知道如何处理,请告诉我:)

      【讨论】:

      • 很好的答案——这段代码在 Mac OSX 上就像一个魅力! :-) 在从许多地方访问设置时,预先进行一些设置可以消除代码重复,请参阅developer.qt.nokia.com/doc/qt-4.8/qsettings.html#basic-usage
      • 我试图把它做对,但没有花太多时间在上面,直到我发现你的示例代码就像一个魅力。 :)
      【解决方案4】:

      我也遇到过这个问题。

      你可以做什么:除了窗口的大小,保存它是否最大化(QWidget::isMaximized())。

      然后下次启动应用程序时,首先设置大小(QWidget::resize()),然后在适当时将其最大化(QWidget::showMaximized())。恢复后,它应该会恢复到正确的大小。

      【讨论】:

      • 无论是否最大化对我来说都很好。由于这个问题已有 5 年历史,我认为这是因为 Qt 更新。
      猜你喜欢
      • 2010-10-25
      • 1970-01-01
      • 2021-01-29
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      相关资源
      最近更新 更多