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

Posted

技术标签:

【中文标题】如何将自定义类型保存到 QSettings?【英文标题】:How To Save Custom Type To QSettings? 【发布时间】:2016-05-19 20:08:59 【问题描述】:

我正在尝试将自定义类型保存到 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 类的要求。

我错过了什么?

【问题讨论】:

Writing and reading custom class to QSettings的可能重复 【参考方案1】:

您必须实现流式传输。 TestClass 应该有 2 个重载运算符 >。例如:

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();

【讨论】:

非常感谢,这解决了问题。我将不得不再次查看文档,因为我没有意识到这是必要的。 之后你是怎么读回来的?你必须做一些与平常不同的事情吗? 没关系:***.com/questions/18144377/…【参考方案2】:

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

【讨论】:

我确实尝试过显式编写构造函数、析构函数和复制构造函数,但它继续给出相同的错误,所以这似乎不是问题。

以上是关于如何将自定义类型保存到 QSettings?的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义类保存/序列化到设置文件?

如何将自定义数组保存/重新加载到 plist

如何使用hibernate java将自定义类保存到mysql数据库[关闭]

如何将自定义 DB 字段保存到图形中的 DB-Acumatica

使用graphql代码生成器时如何将自定义标量类型映射到打字稿类型?

Entityframework 6:如何将自定义类型映射到 SQL 表