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

StackOverflow https://stackoverflow.com/questions/74690

  •  09-06-2019
  •  | 
  •  

Вопрос

У меня есть 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()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top