Как мне сохранить размер окна между сессиями в Qt? - PullRequest
20 голосов
/ 16 сентября 2008

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

Ответы [ 4 ]

18 голосов
/ 17 сентября 2008

Используйте функцию QWidget :: saveGeometry для записи текущих настроек в реестр (доступ к реестру осуществляется с помощью QSettings). Затем используйте restoreGeometry () при запуске, чтобы вернуться в предыдущее состояние.

17 голосов
/ 05 января 2012

Я обнаружил, что комбинация всех предыдущих ответов здесь была необходима в 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();
}

Тем не менее, вертикальная составляющая позиции не совсем правильная, похоже, она игнорирует высоту строки заголовка окна ... если кто-нибудь знает, как с этим бороться, дайте мне знать:)

4 голосов
/ 16 сентября 2008

Я тоже сталкивался с этой проблемой.

Что вы можете сделать: в дополнение к размеру окна сохраните, развернуто ли оно или нет (QWidget::isMaximized()).

Затем в следующий раз, когда вы запустите приложение, сначала установите размер (QWidget::resize()), а затем увеличьте его, если необходимо (QWidget::showMaximized()). После восстановления он должен вернуться к правильному размеру.

0 голосов
/ 03 июня 2012

Изображение в http://qt -project.org / doc / qt-4.8 / application-windows.html показывает, что geometry.x() и geometry.y() не равны x() и y(), которые совпадают с pos().

В моем случае я использую:

x()
y()
width()
height()

и успешно восстановите их с помощью:

move()
resize()
...