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

有帮助吗?

解决方案

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

其他提示

我发现在 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();
}

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

我也遇到过这个问题。

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

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

图像位于 http://qt-project.org/doc/qt-4.8/application-windows.html 表明,那 geometry.x()geometry.y() 不等于 x()y(), ,它们与 pos().

就我而言,我使用:

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

并通过以下命令成功恢复它们:

move()
resize()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top