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()およびがおよび とgeometry.y()等しくないことを示しています。これらは と同じです。x()y()pos()

私の場合、次を使用します。

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

これらを次の方法で正常に復元します。

move()
resize()
于 2012-06-02T22:31:25.287 に答える