Восстановить геометрию и состояние произвольного QDialog

В наших приложениях мы используем настраиваемые диалоговые окна, полностью используя 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 могут даже использоваться во вложенном виде, что и делается в наших приложениях.

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


person Aleph0    schedule 28.11.2018    source источник


Ответы (1)


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

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

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

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

person Deep    schedule 28.11.2018