2008-09-16 18 views
20

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

ответ

17

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

+2

Если вы также хотите сохранить позиции и статус dockwidgets, а не только размер, вы должны использовать QWidget :: saveState() – mtbkrdave 2011-02-28 13:56:06

+1

К сожалению, этот способ не работает для случая, когда у вас есть максимальное окно на втором мониторе (по крайней мере, в Windows 7). Геометрия после восстановления максимизирует окно на первом мониторе. Я использую подход, похожий на ответ iforce2d, чтобы решить эту проблему. – 2013-04-11 08:56:06

4

Я столкнулся с этой проблемой.

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

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

+0

отлично работает для меня не имеет значения, если развернуто или нет. Поскольку вопрос 5 лет, я предполагаю, что это из-за обновлений Qt. – 2013-08-04 18:08:23

17

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

В основной(), настройки положения считываются перед показом в окно в первый раз ...

MainWindow mainWindow; 
mainWindow.readPositionSettings(); 
mainWindow.show(); 

... и эти обработчики событий обновить настройки по мере необходимости. (Это приводит к записи в файле настроек для каждого движения мыши во время перемещения и изменения размера, который не является идеальным.)

void MainWindow::moveEvent(QMoveEvent*) 
{ 
    writePositionSettings(); 
} 

void MainWindow::resizeEvent(QResizeEvent*) 
{ 
    writePositionSettings(); 
} 

void MainWindow::closeEvent(QCloseEvent*) 
{ 
    writePositionSettings(); 
} 

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

0

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

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

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

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

move() 
resize()