【问题标题】:Save (already-existing) QSetting into an INI file将(已经存在的)QSetting 保存到 INI 文件中
【发布时间】:2012-02-14 09:28:32
【问题描述】:

我想将一个已经存在的 QSettings 对象保存到某个 INI 文件中以进行备份。

QSettings 来自应用程序的全局设置,即。可以是注册表、ini文件等


如果有帮助,我的上下文是:

class Params
{
    // All params as data members
    // ...
    void loadGlobal ()
    {
        Qettings s; // Global parameters, paths set by application
        // Fill data members: s.value (...);
    }
};

class Algo
{
    Result run (Params p)
    {
        Result r = F(p);
        return r;
    }
};

int main (...)
{
    Params p;
    p.loadGlobal ();
    Algo a;
    Result r = a.run (p);

    // At this point, save Result and Params into a specific directory
    // Is there a way to do:
    p.saveToIni ("myparams.ini"); // <-- WRONG
}

一种解决方案是将saveTo (QSetting &amp; s) 方法添加到Params 类中:

class Params
{
    void saveTo (QSettings & s)
    {
        s.setValue (...);
    }
};

int main (...)
{
    Params p;
    p.loadGlobal ();
    QSettings bak ("myparams.ini", ...);
    p.saveTo (bak);
}

但我正在寻找不修改 Params 类的解决方案。

【问题讨论】:

    标签: qt ini qsettings


    【解决方案1】:

    嗯,不,QT 并不直接支持这一点。我认为您最好的选择是编写一个辅助类...类似于:

    void copySettings( QSettings &dst, QSettings &src )
    {
        QStringList keys = src.allKeys();
        for( QStringList::iterator i = keys.begin(); i != keys.end(); i++ )
        {
            dst.setValue( *i, src.value( *i ) );
        }
    }
    

    【讨论】:

      【解决方案2】:

      我认为有两个问题:

      • QSettings 没有复制构造函数或赋值运算符(据我所知),因此您可能必须使用 allKeys() 编写自己的副本。
      • 您不能将 QSettings 保存到任意文件,但您可以使用静态方法 QSettings::setPath() 设置用于特定格式和范围的路径。请注意,您需要在创建备份 QSettings 对象之前执行此操作(并且您将使用格式 IniFormat)。

      如果您无法完全控制生成的路径,这应该足够了。如果没有,您仍然可以执行上述操作,然后使用 fileName() 获取文件名并使用系统调用将文件复制/移动到所需的最终位置。

      【讨论】:

      • 您好,感谢您花时间回答。我同意你的第一点。不过,我不同意第二个:QSettings 有一个接受文件名作为参数的 ctor(它将存储其内容)。也可以使用QCoreApplication::setApplicationName()和QCoreApplication::setOrganization*()`的组合来精确控制QSettings的默认路径
      • 果然......在回答问题之前应该总是重新阅读文档。
      猜你喜欢
      • 2016-01-25
      • 1970-01-01
      • 2017-08-08
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2016-04-30
      相关资源
      最近更新 更多