【问题标题】:Application GUI state saving in QtQt 中的应用程序 GUI 状态保存
【发布时间】:2015-11-11 18:08:25
【问题描述】:

什么是保存 Qt GUI 状态的最佳且适当的方法,以便我获得与关闭应用程序时相同的状态?

我的意思是:当前索引(用于组合框...)、调色板、小部件位置...就在关闭应用程序之前

【问题讨论】:

  • 将您感兴趣的数据写入文件。启动应用程序时读取文件。确保没有人向您的文件添加无效数据以试图攻击您的应用程序。祝你好运。你也应该阅读how to ask good questions

标签: qt user-interface


【解决方案1】:

您可以使用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 覆盖调用这两个函数,如下所示:

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();
}

【讨论】:

【解决方案2】:

直接的答案需要对您的代码进行具体的详细设计,而不是真正的简短 Qt 问题,甚至是 Qt 特有的问题。那是关于 C++,它不是基于 VM 的语言,它有助于将程序代码的状态序列化为数据。让所有对象可序列化后,我们就可以尝试应用某些 C++/Qt 类/技术。

不过,使用 Java 等语言更容易完成这项任务。并且使用 C++/Qt,您必须定期使序列化/序列化/恢复在您的代码中运行的所有内容,并且只要没有完全捕获上下文,仍然不能保证其工作正常。这个任务肯定不容易,而且只有在特定的应用中才有意义。

您可以直接从 Qt 获得的最多是保存/恢复 QMainWindow 和其他独立的小部件几何(位置/大小):

saveGeometry restoreGeometry

...该解决方案仍然有些不完整,或者您可能/不使用 QSettings 进行存储。

【讨论】:

    【解决方案3】:

    我为此使用 QSettings。使用类似于 Zlatomir 的例程。

    对于项目中的每个窗口,我在 QSettings 中使用不同的部分,并在每个窗口的源代码中都有 readSettings() 和 writeSettings()。

    表单上我想要保留的任何内容都必须明确保存和调用。在 QComboBox 的情况下,它将类似于:

    QSettings settings("Organisation", "MySoftware");
    settings.beginGroup("WindowNumberTwo");
    settings.setValue("ComboIndex", combobox->currentIndex());
    // save more values here
    //  ...
    settings.endGroup();
    

    我不知道持久化窗口状态的内置方法 - 它必须不按值计算。

    【讨论】:

      猜你喜欢
      • 2012-06-11
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多