【问题标题】:QSettings: Copy, modify but avoid changing underlying .ini fileQSettings:复制、修改但避免更改底层 .ini 文件
【发布时间】:2012-10-16 14:58:29
【问题描述】:

我从 .ini 文件中读取了一些 QSettings

QSettings* settingsDocRoot=new QSettings(_settingsFile ,QSettings::IniFormat, parent);

这被传递给某个对象。但是,然后我复制QSettings* s2= new QSettings(settingsDocRoot); 并修改一个特定值s2->setValue("path", whateverNewPath);

基本上我想将一个稍作修改的QSettings 对象传递给另一个对象。但是如何避免原始 ini 文件被更新使用更改后的值 (s2->setValue)?

一个想法是,只需将路径设置为“”。但是,根据QSettings - where is the location of the ini file? 会假设一个默认位置(好的,不会更改原始文件,但会写入不必要的文件)。

【问题讨论】:

    标签: qt qsettings


    【解决方案1】:

    QSettings 完全是为持久性而设计的。如果您不希望将副本写入磁盘,最好将所有值复制到 QHash 中并将其传递给其他对象:

    QHash<QString, QVariant> hash;
    const QStringList keys = settings->allKeys();
    Q_FOREACH(QString key, keys) {
      hash[key] = settings->value(key());
    }
    

    【讨论】:

    • 好主意,需要测试一下,因为我传递QSettings的类不是我写的,不能修改。
    • 我没有看到通过 QSettings 将 QHash / QMap 传递给签名的方法,是吗?
    【解决方案2】:

    我目前正在做以下事情:

        QSettings* settingsWsNaviGraph = new QSettings(settingsDocRoot);
        // avoid writing to file
        settingsWsNaviGraph->setPath(QSettings::InvalidFormat, QSettings::UserScope, "");
    

    这个肮脏的黑客似乎避免写入,至少我的原始文件保持不变,我还没有看到任何不需要的文件(如果我找到了会报告)。

    如果这里不起作用,我会尝试使用虚假的读/写方法注册我自己的格式。见here

    【讨论】:

    • 不幸的是,这在最新的 Qt 5.12 中似乎不起作用。
    猜你喜欢
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    相关资源
    最近更新 更多