Qt, смещение при восстановлении геометрии - PullRequest
0 голосов
/ 23 января 2019

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

enter image description here

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

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

Есть идеи?

Редактировать 1

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

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

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

Ответы [ 2 ]

0 голосов
/ 23 января 2019

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

QRect ng = w->normalGeometry();
QRect frame = w->frameGeometry();
ng.adjust(-frame.x(), -frame.y(), -frame.x(), -frame.y());

и сохранение последних значений

0 голосов
/ 23 января 2019

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

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