我正在尝试将自定义类型保存到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
Run Code Online (Sandbox Code Playgroud)
这是将类的实例保存到QSettings的代码
TestClass test;
test.testString = "Test";
test.testInt = 10;
test.testBool = false;
settings.setValue("TestGroup/TestVal", QVariant::fromValue(test));
settings.sync();
Run Code Online (Sandbox Code Playgroud)
我在运行时得到的错误是:
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.
Run Code Online (Sandbox Code Playgroud)
根据文档,该类必须提供默认构造函数,析构函数和复制构造函数.对于这个类,自动生成的构造函数,析构函数和复制构造函数就足够了,所以我没有提供一个(尽管我确实试过它,看看是不是问题).我也使用了Q_DECLARE_METATYPE(),所以QMetaType知道这个类,所以据我所知,我已经满足了使用QVariant类的要求.
我错过了什么?
小智 10
你必须实现流媒体.旅游类应该有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)
Run Code Online (Sandbox Code Playgroud)
在保存TestClass实例之前,您必须使用qRegisterMetaTypeStreamOperators函数,如下所示:
qRegisterMetaTypeStreamOperators<TestClass>("TestClass");
QSettings settings(QSettings::IniFormat, QSettings::UserScope,"MySoft", "Star Runner");
settings.setValue("TestGroup/TestVal", QVariant::fromValue(test));
settings.sync();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2156 次 |
| 最近记录: |