Qt でセッション間のウィンドウ サイズを保存するにはどうすればよいですか?
質問
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()