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()