У меня есть QMainWindow в приложении Qt. Когда я закрываю его, я хочу сохранить его текущий размер восстановления (размер окна, когда он не максимизирован). Это хорошо работает, когда я закрываю окно в режиме восстановления (то есть не максимизируется). Но если я закрою окно, если оно будет максимизировано, то в следующий раз, когда я запустим приложение и восстановит приложение (потому что оно начинается в максимизированном режиме), тогда он не помнит размер, который он должен восстановить. Есть ли способ сделать это?Как сохранить размер окна между сеансами в Qt?
ответ
Используйте функцию QWidget::saveGeometry, чтобы записать текущие настройки в реестр. (Доступ к реестру осуществляется с помощью QSettings). Затем используйте restoreGeometry() при запуске, чтобы вернуться в предыдущее состояние.
Я столкнулся с этой проблемой.
Что вы можете сделать: в дополнение к размеру окна, сохраните его максимально или нет (QWidget::isMaximized()
).
Затем в следующий раз, когда вы запустите приложение, сначала установите размер (QWidget::resize()
), а затем увеличьте его, если необходимо (QWidget::showMaximized()
). Когда он будет восстановлен, он должен вернуться к правильному размеру.
отлично работает для меня не имеет значения, если развернуто или нет. Поскольку вопрос 5 лет, я предполагаю, что это из-за обновлений Qt. – 2013-08-04 18:08:23
Я нашел, что комбинация всех предыдущих ответов здесь была необходима на 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();
}
Тем не менее, вертикальная составляющая позиции не совсем верно, это, кажется, не обращая внимания на высота заголовка окна ... если кто-нибудь знает, как справиться с этим, дайте мне знать :)
изображение в http://qt-project.org/doc/qt-4.8/application-windows.html показывает, что geometry.x()
и geometry.y()
не равны x()
и y()
, которые являются такими же, как pos()
,
В моем случае, я использую:
x()
y()
width()
height()
и восстановить их успешно с:
move()
resize()
Если вы также хотите сохранить позиции и статус dockwidgets, а не только размер, вы должны использовать QWidget :: saveState() – mtbkrdave 2011-02-28 13:56:06
К сожалению, этот способ не работает для случая, когда у вас есть максимальное окно на втором мониторе (по крайней мере, в Windows 7). Геометрия после восстановления максимизирует окно на первом мониторе. Я использую подход, похожий на ответ iforce2d, чтобы решить эту проблему. – 2013-04-11 08:56:06