В Qt 5.11 у меня есть этот код для сохранения конечной геометрии восстановления подкласса QDialog:
class HlgRunoffEditorDialog:public QDialog
{
some code
}
void HlgRunoffEditorDialog::show()
{
if (isVisible())
return;
ReosSettings settings;
restoreGeometry(settings.value(QStringLiteral("RunoffEditorDialog/geometry")).toByteArray());
ui->splitter->restoreState(settings.value(QStringLiteral("RunoffEditorDialog/splitter/geometry")).toByteArray());
QDialog::show();
}
void HlgRunoffEditorDialog::closeEvent(QCloseEvent *event)
{
updateSettings();
QDialog::closeEvent(event);
}
void HlgRunoffEditorDialog::updateSettings()
{
ReosSettings settings;
settings.setValue(QStringLiteral("RunoffEditorDialog/geometry"),saveGeometry());
settings.setValue(QStringLiteral("RunoffEditorDialog/splitter/geometry"),ui->splitter->saveState());
}
Проблема в том, что когда вызывается метод show(), окна имеют смещение относительно позиции перед событием закрытия. Изображение более явное, чем текст:
Красная линия — это позиция перед событием закрытия.
Похоже, что новая позиция устанавливается в верхней левой точке виджета, исключая рамку окна, до того, как событие закрытия устанавливается в верхней левой точке виджета, включая рамку окна после вызова идентификатора метода show().
Любая идея ?
Изменить 1
Это смещение выше для Windows. Когда я запускаю Linux KDE, кажется, что смещение в другую сторону ....
Редактировать 2:
Это смещение появляется, когда QDialog закрыт крестом в правом верхнем углу. Когда QDialog закрывается кнопкой закрытия (подключение к слоту close()), смещения здесь нет...
Для корректного восстановления состояния видимости виджетов (как окон) необходимо соблюдать следующий порядок вызовов:
// 1) show the widget
widget->show();
// 2) set status bar visibility (if exists)
//widget->statusBar->setVisible(booleanValueFromSettings);
// 3) set margins (if use it)
//widget->setContentsMargins(a, b, c, d);
// 4) geometry
widget->restoreGeometry(byteArrayFromSettings);
// 5) state (can be use it and for you splitter)
widget->restoreState(byteArrayFromSettings);
@vcloarec удалить старый файл настроек из файловой системы. И перед показом вы можете установить значения по умолчанию (например, min w/h)
Я помню проект, где мне пришлось немного посчитать, что-то вроде этого:
QRect ng = w->normalGeometry();
QRect frame = w->frameGeometry();
ng.adjust(-frame.x(), -frame.y(), -frame.x(), -frame.y());
и сохранение последних значений
И ng.adjust(frame.x(), frame.y(), frame.x(), frame.y()) для X11 в Linux??? ))
Если я поставлю метод show() перед восстановлением геометрии, смещение останется здесь...