Восстановить геометрию и состояние произвольного QDialog - PullRequest
0 голосов
/ 28 ноября 2018

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

(Иногда мы также используем QDockWidget, но, похоже, это похоже.)

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

После ознакомления с документацией мне удалось восстановить состояние и геометрию конкретного диалога, содержащего один QSplitter.

#include <QApplication>
#include <QLabel>
#include <QDebug>
#include <QSplitter>
#include <QPushButton>
#include <QTextEdit>
#include <QDialog>
#include <QSettings>
#include <QHBoxLayout>

int main(int argc, char** args) {
    QApplication app(argc, args);
    app.setOrganizationName("Tech");
    app.setOrganizationDomain("qt.us");
    app.setApplicationName("RestoreLayout");
    app.setApplicationVersion("1.0");
    QDialog dialog;
    dialog.setLayout(new QHBoxLayout);
    auto splitter = new QSplitter;
    splitter->addWidget(new QLabel("Left"));
    splitter->addWidget(new QLabel("Right"));
    dialog.layout()->addWidget(splitter);
    auto accept = new QPushButton("Accept");
    accept->connect(accept, &QPushButton::clicked, [&](){
        dialog.accept();
    });
    splitter->addWidget(accept);
    auto geom= QSettings().value("Geom").toByteArray();
    auto splitterState = QSettings().value("State").toByteArray();
    qDebug() << geom;
    qDebug() << splitterState;
    dialog.restoreGeometry(geom);
    splitter->restoreState(splitterState);
    dialog.show();
    dialog.connect(&dialog, &QDialog::accepted, [&]() {
        QSettings().setValue("Geom", dialog.saveGeometry());
        QSettings().setValue("State", splitter->saveState());
        app.quit();
    });
    app.exec();
}

К сожалению, это, кажется, подход, которыйне пригодный для использования вообще.

Предположим, что существует некоторый произвольный диалог, который должен восстановить его геометрию и состояние.Более того, QSplitter и QDockWidget могут даже использоваться во вложенном порядке, что делается в наших приложениях.

Как сторонний программист может восстановить геометрию и состояние произвольного диалога, который может быть легкоприменимо ко всем возможным диалогам?

1 Ответ

0 голосов
/ 28 ноября 2018

Для сохранения состояний QDockWidget каждый должен иметь имя: dockWidgetN-> setObjectName ("dock-widget-N");

Но вы можете сохранить только состояние QMainWindow для сохранения состояний доков в этом окне.

Вы можете отдельно сохранять состояния с помощью QSettings (это QByteArray) и использовать несколько состояний для многих окон.

Смотрите здесь: Как сохранить состояние диалога в Qt?

...