Вторник, 09 февраля 2021 19:00

Сохранение и восстановление позиции и размеров главного окна при запуске и завершении программы

Россия

В статье мы рассмотрели сохранение позиции виджета.

Сегодня мы рассмотрим сохранение позиции главного окна.

Создадим новый проект Qt Widgets и назовем его PosSaveRestore

Класс для сохранения состояния

Для того, чтобы сохранять состояние окна, напишем создадим новый класс – MainWindowState

Заголовок: 

#ifndef MAINWINDOWSTATE_H
#define MAINWINDOWSTATE_H

#include <QPoint>
#include <QSize>


class MainWindowState
{
public:
    explicit MainWindowState();
    void SaveState(const QPoint &pos, const QSize &size);
    void RestoreState(QPoint &pos, QSize &size);
};

#endif // MAINWINDOWSTATE_H

Реализация: 

#include "mainwindowstate.h"

#include <QSettings>

MainWindowState::MainWindowState()
{
}

void MainWindowState::SaveState(const QPoint &pos, const QSize &size)
{
    QSettings settings("AltuninVV", "PosSizeDemo");
    settings.beginGroup("MainWindow");
        settings.setValue("pos", pos);
        settings.setValue("size", size);
    settings.endGroup();
}

void MainWindowState::RestoreState(QPoint &pos, QSize &size)
{
    QSettings settings("AltuninVV", "PosSizeDemo");
    settings.beginGroup("MainWindow");
        QPoint oldPoint = settings.value("pos", QPoint(0, 0)).toPoint();
        if (oldPoint.x()!=0 && oldPoint.y()!=0) //check if there old values
        {
            pos.setX(oldPoint.x());
            pos.setY(oldPoint.y());
        }

        QSize oldSize = settings.value("size", QSize(0, 0)).toSize();
        if (oldSize.width()!=0 && oldSize.height()!=0) //check if there old values
        {
            size.setWidth(oldSize.width());
            size.setHeight(oldSize.height());
        }

        settings.endGroup();
}

Метод SaveState() позволяет нам сохранить состояние окна, а метод RestoreState() это состояние восстановить.

Использование класса

Добавим в конструктор главного окна код:

    QPoint pos;
    QSize size;

    state.RestoreState(pos, size);

    this->move(pos);
    this->resize(size);

Здесь мы объявляем две переменные, одна для хранения положения окна, вторая для размеров.

После этого вызываем метод класса RestoreState() передавая аргументы по ссылке.

Затем перемещаем окно  в новую позицию и изменяем его размер.

Обратите внимание, что при первом запуске окно будет выглядеть так:

2021-02-09_17-21-12.png

Вы можете добавить дополнительные проверки и задать значения по умолчанию для положения и размера, так как при первом запуске они будут равны нулю.

Добавим в деструктор класса MainWindow::~MainWindow() перед строкой:

delete ui;

Следующий код:

state.SaveState(this->pos(), this->size());

Здесь мы сохраняем положение и размер окна.

Заключение

Сегодня мы рассмотрели сохранение состояния окна – положение и размера, между запусками программы для чего был создан класс для сохранения и восстановления состояния.

Исходный код вы можете найти на Github.

Прочитано 337 раз Последнее изменение Вторник, 09 февраля 2021 19:33
Другие материалы в этой категории: « Отладка классов в Qt5 с помощью QDebug