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

标签 c++ qt

我正在尝试将自定义类型保存到 QSettings,但在运行时出现错误。这是我要保存的类(class):

#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 一起使用的要求。

我错过了什么?

最佳答案

您必须实现流式传输。 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();

关于c++ - 如何将自定义类型保存到 QSettings?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37333084/

相关文章:

c++ - openmp 循环一开始非常快,但后来变慢(几乎卡住了)

c++ - 模板函数中需要什么类型的迭代器?

qt - 如何停止QElapsedTimer?

c++ - 使用VTK和QT多线程时访​​问冲突异常

c++ - Qt - 树小部件项目点击的事件监听器?

c++ - "When"编译器是否隐式声明了默认构造函数?

c++ - 在 VxWorks 中使用 Boost C++ 库时出错

java - 开始在 Android 2.3 上编程

c++ - 黑莓 10 中的 Web 服务

python - PyQT:旋转 QLabel 使其位于对角线而不是水平线