如何将自定义类型保存到QSettings?

时间:2016-05-19 20:09:00

标签: c++ qt

我试图将自定义类型保存到QSettings但我在运行时遇到错误。这是我试图保存的课程:

#ifndef TESTCLASS_H
#define TESTCLASS_H

#include <QMetaType>
#include <QString>

class TestClass
{
public:
    QString testString;
    int testInt;
    bool testBool;
};

Q_DECLARE_METATYPE(TestClass)

#endif

以下是将类实例保存到QSettings

的代码
TestClass test;
test.testString = "Test";
test.testInt = 10;
test.testBool = false;

settings.setValue("TestGroup/TestVal", QVariant::fromValue(test));
settings.sync();

我在运行时得到的错误是:

QVariant::save: unable to save type 'TestClass' (type id: 1032).

ASSERT failure in QVariant::save: "Invalid type to save", file kernel\qvariant.cpp, line 2124
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.

根据文档,该类必须提供默认构造函数,析构函数和复制构造函数。对于这个类,自动生成的构造函数,析构函数和复制构造函数就足够了,所以我还没有提供一个(尽管我确实试过它,看看是不是问题)。我还使用了Q_DECLARE_METATYPE(),所以QMetaType知道这个类,所以据我所知,我已经满足了使用QVariant类的要求。

我错过了什么?

2 个答案:

答案 0 :(得分:10)

您必须实施流式传输。 旅游类应该有2个重载运算符&lt;&lt;,&gt;&gt;。例如:

class TestClass
{
public:
    QString testString;
    qint32 testInt;
    friend QDataStream & operator << (QDataStream &arch, const TestClass & object)
    {
        arch << object.testString;
        arch << object.testInt;
        return arch;
    }

    friend QDataStream & operator >> (QDataStream &arch, TestClass & object)
    {
        arch >> object.testString;
        arch >> object.testInt;
        return arch;
    }
};

Q_DECLARE_METATYPE(TestClass)

在保存TestClass实例之前,你必须使用qRegisterMetaTypeStreamOperators函数,如下所示:

    qRegisterMetaTypeStreamOperators<TestClass>("TestClass");
    QSettings settings(QSettings::IniFormat, QSettings::UserScope,"MySoft", "Star Runner");
    settings.setValue("TestGroup/TestVal", QVariant::fromValue(test));
    settings.sync();

答案 1 :(得分:-1)

在您提供的示例中,您应该将TestClass更改为struct或显式编写构造函数,析构函数,复制构造函数。