У меня есть QMainWindow в приложении Qt. Когда я закрываю его, я хочу сохранить его текущий размер восстановления (размер окна, когда он не максимизирован). Это хорошо работает, когда я закрываю окно в режиме восстановления (то есть не максимизируется). Но если я закрою окно, если оно будет максимизировано, то в следующий раз, когда я запустим приложение и восстановит приложение (потому что оно начинается в максимизированном режиме), тогда он не помнит размер, который он должен восстановить. Есть ли способ сделать это?
Как сохранить размер окна между сеансами в Qt?
Ответ 1
Используйте функцию QWidget:: saveGeometry, чтобы записать текущие настройки в реестр (доступ к реестру осуществляется с помощью QSettings). Затем используйте restoreGeometry() при запуске, чтобы вернуться в предыдущее состояние.
Ответ 2
Я обнаружил, что комбинация всех предыдущих ответов здесь была необходима на 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();
}
Тем не менее, вертикальная составляющая позиции не совсем правильная, она, кажется, игнорирует высоту строки заголовка окна... если кто-нибудь знает, как с этим бороться: дайте мне знать:)
Ответ 3
Я тоже столкнулся с этой проблемой.
Что вы можете сделать: в дополнение к размеру окна, сохраните его максимально или нет (QWidget::isMaximized()
).
Затем в следующий раз, когда вы запустите приложение, сначала установите размер (QWidget::resize()
), а затем при необходимости увеличьте его (QWidget::showMaximized()
). Когда он будет восстановлен, он должен вернуться к правильному размеру.
Ответ 4
Изображение в http://qt-project.org/doc/qt-4.8/application-windows.html показывает, что geometry.x()
и geometry.y()
не равны x()
и y()
, которые являются такими же, как pos()
.
В моем случае я использую:
x()
y()
width()
height()
и восстановить их успешно:
move()
resize()