Как сохранить размер окна между сеансами в Qt?
Вопрос
У меня есть QMainWindow в приложении Qt.Когда я закрываю его, я хочу, чтобы он сохранил текущий размер восстановления (размер окна, когда оно не развернуто на максимум).Это хорошо работает, когда я закрываю окно в режиме восстановления (то есть не развернуто).Но если я закрою окно, если оно развернуто, то в следующий раз, когда я запущу приложение и восстановлю приложение (потому что оно запускается в развернутом режиме), то оно не запомнит размер, до которого должно восстановиться.Есть ли способ сделать это?
Решение
Использовать QWidget::saveGeometry функция записи текущих настроек в реестр. (Доступ к реестру осуществляется с помощью QSettings).Затем используйте restartGeometry() при запуске, чтобы вернуться в предыдущее состояние.
Другие советы
Я обнаружил, что в 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()