Подтвердить что ты не робот

Как сохранить размер окна между сеансами в Qt?

У меня есть QMainWindow в приложении Qt. Когда я закрываю его, я хочу сохранить его текущий размер восстановления (размер окна, когда он не максимизирован). Это хорошо работает, когда я закрываю окно в режиме восстановления (то есть не максимизируется). Но если я закрою окно, если оно будет максимизировано, то в следующий раз, когда я запустим приложение и восстановит приложение (потому что оно начинается в максимизированном режиме), тогда он не помнит размер, который он должен восстановить. Есть ли способ сделать это?

4b9b3361

Ответ 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()