Qt, смещение при восстановлении геометрии

В 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(), окна имеют смещение относительно позиции перед событием закрытия. Изображение более явное, чем текст:

Qt, смещение при восстановлении геометрии

Красная линия — это позиция перед событием закрытия.

Похоже, что новая позиция устанавливается в верхней левой точке виджета, исключая рамку окна, до того, как событие закрытия устанавливается в верхней левой точке виджета, включая рамку окна после вызова идентификатора метода show().

Любая идея ?

Изменить 1

Это смещение выше для Windows. Когда я запускаю Linux KDE, кажется, что смещение в другую сторону ....

Редактировать 2:

Это смещение появляется, когда QDialog закрыт крестом в правом верхнем углу. Когда QDialog закрывается кнопкой закрытия (подключение к слоту close()), смещения здесь нет...

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
189
2

Ответы 2

Для корректного восстановления состояния видимости виджетов (как окон) необходимо соблюдать следующий порядок вызовов:

// 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);

Если я поставлю метод show() перед восстановлением геометрии, смещение останется здесь...

vcloarec 23.01.2019 11:26

@vcloarec удалить старый файл настроек из файловой системы. И перед показом вы можете установить значения по умолчанию (например, min w/h)

Deep 23.01.2019 13:11

Я помню проект, где мне пришлось немного посчитать, что-то вроде этого:

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??? ))

Deep 23.01.2019 13:08

Другие вопросы по теме