15

QSettings を介してカスタム クラスのインスタンスをレジストリに保存する必要があります。Qt のドキュメントを読んだ後、必要な機能を実装したと思いますが、何も保存できません。

ここに私のカスタムクラスがあります:

class SRSDefinition{
public:
    SRSDefinition(QString name, QString definition) : qsName(name), qsDefinition(definition)
    {
        qRegisterMetaType<SRSDefinition>("SRSDefinition");
        qRegisterMetaTypeStreamOperators<SRSDefinition>("SRSDefinition");       
    }
    SRSDefinition(const SRSDefinition& original) : qsName(original.qsName), qsDefinition(original.qsDefinition) {}
    SRSDefinition() : qsName(""), qsDefinition(""){}
    ~SRSDefinition();
    QString qsName;
    QString qsDefinition;
private:
    friend QDataStream& operator << (QDataStream& out, const SRSDefinition& valeur) {out << valeur.qsName << valeur.qsDefinition; return out; }
    friend QDataStream& operator >> (QDataStream& in, SRSDefinition& valeur) {in >> valeur.qsName >> valeur.qsDefinition; return in;}
};
Q_DECLARE_METATYPE(SRSDefinition)
QDataStream& operator << (QDataStream& out, const SRSDefinition& Valeur);
QDataStream& operator >> (QDataStream& in, SRSDefinition& Valeur);

レジストリに保存:

QSettings settings("Organization", "Application");
QVariant variant;
variant.setValue(QVariant::fromValue<SRSDefinition>(m_srsSelected));
settings.setValue("Shared/RecentSRS", variant);

レジストリから読み込み中:

QSettings settings("Organization", "Application");
m_srsSelected = settings.value("Shared/RecentSRS").value<SRSDefinition>();

レジストリに新しいキーが作成されますが、クラスの名前だと思われる16進コードが含まれています... ここに画像の説明を入力

値を効果的に保存する方法はありますか?

4

1 に答える 1

24

qRegisterMetaTypeStreamOperators<YourType>("YourType")QVariant でカスタム型のシリアル化/逆シリアル化を有効にするために使用します。この関数は、型の QDataStream 入力/出力関数を Qt のメタタイプ システムに登録し、カスタム型を含むバリアントを保存/ロードするときに呼び出すことができるようにします。

#include <QtCore/QDebug>
#include <QtCore/QDataStream>
#include <QtCore/QSettings>

struct CustomType {
    QString name;
    int age;
};

Q_DECLARE_METATYPE(CustomType);

QDataStream& operator<<(QDataStream& out, const CustomType& v) {
    out << v.name << v.age;
    return out;
}

QDataStream& operator>>(QDataStream& in, CustomType& v) {
    in >> v.name;
    in >> v.age;
    return in;
}

int main(int,char**) {

    qRegisterMetaTypeStreamOperators<CustomType>("CustomType");

    {
        CustomType t;
        t.name = "John Smith";
        t.age = 42;
        QSettings s("config.ini", QSettings::IniFormat);
        s.setValue("user", QVariant::fromValue(t));
    }

    {
        QSettings s("config.ini", QSettings::IniFormat);
        QVariant value = s.value("user");
        CustomType t = value.value<CustomType>();

        qDebug() << t.name << t.age;
    }


    return 0;
}
于 2013-08-09T10:37:09.667 に答える