Qt中应用程序GUI状态的保存

3

什么是保存Qt GUI状态的最佳适当方式,以便在重新打开应用程序时恢复与关闭前相同的状态?

所谓状态是指:在关闭应用程序之前的当前索引(如组合框...),颜色调色板,小部件位置等。


1
将您感兴趣的数据写入文件。在应用程序启动时读取该文件。确保没有人添加无效数据以攻击您的应用程序。祝你好运。您还应该阅读有关如何提出好问题的内容。 - code_dredd
3个回答

9
你可以使用QSettings类。
QSettings类的简单使用(代码灵感来自于Qt的文档):
在应用程序的主窗口中,编写保存和恢复设置的成员函数:
void MainWindow::writeSettings()
{
    QSettings settings("reaffer Soft", "reafferApp");

    settings.beginGroup("MainWindow");
    settings.setValue("size", size());
    settings.setValue("pos", pos());
    settings.endGroup();
}

void MainWindow::readSettings()
{
    QSettings settings("reaffer Soft", "reafferApp");

    settings.beginGroup("MainWindow");
    resize(settings.value("size", QSize(400, 400)).toSize());
    move(settings.value("pos", QPoint(200, 200)).toPoint());
    settings.endGroup();
}

在MainWindow构造函数和closeEvent重写中调用这两个函数,示例如下:
```cpp function1(); function2(); ```
MainWindow::MainWindow()
{
    // code from constructor
    //...
    readSettings();
}

void MainWindow::closeEvent(QCloseEvent *event)
{
    //optional check if the user really want to quit
    // and/or if the user want to save settings
    writeSettings();
    event->accept();
}

3
好的,在QSettings文档中有一个“恢复GUI应用程序状态”的部分:http://doc.qt.io/qt-5.5/qsettings.html。 - juzzlin

3
直接的答案需要为您的代码进行具体详细的设计,而不是一个简短的Qt问题或者特定于Qt的问题。这是关于C++的,它不是基于VM的语言,不能帮助将程序代码状态序列化为数据。当所有对象都可序列化时,我们可以尝试应用某些C++/Qt类/技术。
使用像Java这样的语言更容易完成此任务。使用C++/Qt,您必须经常使运行在代码中的所有内容可序列化/序列化/还原,并且只要上下文没有完全捕获,就无法保证其有效性。这个任务肯定不容易,只有在特定的应用程序中才有意义。
您可以从Qt中直接获得的最多的是保存/恢复QMainWindow和其他独立小部件的几何形状(位置/大小): saveGeometry restoreGeometry ... 这个解决方案仍然有些不完整,或者您可以/不可以使用QSettings进行存储。

1
我使用QSettings来实现这个功能,其方法类似于Zlatomir的方法。
对于项目中的每个窗口,我在QSettings中使用不同的部分,并在每个窗口的源代码中编写readSettings()和writeSettings()函数。
我需要显式地保存和恢复表单上想要保留的任何内容。例如,对于QComboBox,我会这样做:
QSettings settings("Organisation", "MySoftware");
settings.beginGroup("WindowNumberTwo");
settings.setValue("ComboIndex", combobox->currentIndex());
// save more values here
//  ...
settings.endGroup();

我不知道有内置的方法来保留窗口状态 - 必须一个值一个值地进行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接