6

我想将一个已经存在的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 & s)方法Params

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

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

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

4

2 回答 2

10

嗯,不,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 ) );
    }
}
于 2012-01-19T18:06:44.350 回答
-1

我认为有2个问题:

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

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

于 2012-01-20T00:15:30.860 回答