20

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

4

4 回答 4

19

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

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

于 2012-01-05T01:57:24.633 回答
18

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

于 2008-09-16T20:33:35.437 回答
4

我也遇到过这个问题。

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

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

于 2008-09-16T17:36:58.467 回答
0

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

就我而言,我使用:

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

并通过以下方式成功恢复这些:

move()
resize()
于 2012-06-02T22:31:25.287 回答