使用QT设置获取配置文件设置

时间:2016-04-22 15:04:38

标签: c++ qt

我使用Qt设置并将对象保存到文件中。它保存到一个名为sessionrc的文件中。

现在我尝试从设置中加载对象并将其保存回来。

问题是我无法从设置中识别对象,因此我可以加载保存的所有配置文件。

我使用以下加载和保存功能

let ordersPredicate = NSPredicate()//some predicate passed in
let ordersPredicateFormat = orderPredicate.stringForSubQuery("$x.")
let subQueryPredicate = NSPredicate(format: "SUBQUERY(orders, $x, \(ordersPredicateFormat)).@count > 0")

当前设置文件是

void ProfileManager::loadFrom(Settings &set, bool ownGroup)
{
    qDebug()<<"LOAD";
    foreach (const QString &group, set.childGroups()) {
        if(group == "Profile")
        {
            Profile *profile = new Profile();
            profile->setObjectName(group);
            profile->loadFrom(set);
            m_Profiles << profile;
        }
    }


    EraObject::staticLoadFrom(set, this);

}

void ProfileManager::saveTo(Settings &set, bool ownGroup, bool force)
{
    EraObject::staticSaveTo(set, this, ownGroup, force);

     foreach(Profile * profile, m_Profiles) {
        profile->saveTo(set);
    }

}

[www]是保存的个人资料。但我有很多。如何加载并正确保存

1 个答案:

答案 0 :(得分:1)

// main.cpp
#include <QCoreApplication>
#include <QSettings>
#include <QVector>
#include <QDebug>
#include <QMetaProperty>

class Profile : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString name READ name WRITE setName )
    Q_PROPERTY(QString title READ title WRITE setTitle )

public:
    explicit Profile(QObject *parent = 0) : QObject(parent) {
    }

    QString name() const {
        return name_;
    }
    void setName(QString name) {
        name_ = name;
    }

    QString title() const {
        return title_;
    }
    void setTitle(QString title) {
        title_ = title;
    }

    void save(QSettings& settings) const {
        for(int i=0; i<metaObject()->propertyCount(); ++i) {
            const auto& p = metaObject()->property(i);
            if(p.isStored(this)) {
                settings.setValue(p.name(), property(p.name()));
            }
        }
    }

    void load(QSettings& settings) {
        for(int i=0; i<metaObject()->propertyCount(); ++i) {
            const auto& p = metaObject()->property(i);
            if(p.isStored(this)) {
                setProperty(p.name(), settings.value(p.name()));
            }
        }
    }

private:
    QString name_;
    QString title_;
};

#include "main.moc"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QObject garbageCollector;
    QVector<Profile*> profiles;
    {
        Profile* p1 = new Profile(&garbageCollector);
        p1->setName("profilename1");
        p1->setTitle("Profile 1");
        Profile* p2 = new Profile(&garbageCollector);
        p2->setName("profilename2");
        p2->setTitle("Profile 2");
        profiles.append(p1);
        profiles.append(p2);
    }

    QSettings s("profiles.ini", QSettings::IniFormat);

    // write profiles
    {
        s.beginGroup("profiles");
        foreach(const Profile*p, profiles) {
            s.beginGroup(p->name());
            p->save(s);
            s.endGroup();
        }
        s.endGroup();
        s.sync(); // force write
    }
    // read profiles
    {
        s.beginGroup("profiles");
        foreach(const QString& g, s.childGroups()) {
            Profile p;
            s.beginGroup(g);
            p.load(s);
            s.endGroup();
            qDebug() << p.name();
            qDebug() << p.title();
        }
        s.endGroup();

    }
    return 0;
}