1

在我们的应用程序中,我们使用了可自定义的对话框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可能以嵌套方式使用,这是在我们的应用程序中完成的。

外部程序员如何恢复可以轻松应用于所有可能对话框的任意对话框的几何形状和状态?

4

1 回答 1

1

为了保存 QDockWidget 的每个状态,它必须命名为:dockWidgetN->setObjectName("dock-widget-N");

但是您只能保存 QMainWindow 状态以在此窗口中保存停靠点的状态。

您可以通过 QSettings(它是 QByteArray)单独保存状态,并为多个窗口使用某种状态。

请参见此处:如何在 Qt 中保存对话框的状态?

于 2018-11-28T12:19:49.593 回答