我正在使用QSettings存储指向自定义类的指针列表,但是当我尝试从QSettings读回时,我收到了一个memroy错误。我做了以下事情:
将我的自定义类声明为元类型:
Q_DECLARE_METATYPE(QCustomAction*)
Q_DECLARE_METATYPE(QList<QCustomAction*>)
将自定义类注册为元类型及其运算符:
qRegisterMetaType<QCustomAction*>("QCustomAction*");
qRegisterMetaTypeStreamOperators<QCustomAction*>("QCustomAction*");
qRegisterMetaType<QList<QCustomAction*>>("QList<QCustomAction*>");
qRegisterMetaTypeStreamOperators<QList<QCustomAction*>>("QList<QCustomAction*>");
重载流运营商:
QDataStream &operator<<(QDataStream &out, QCustomAction* const obj)
{
out << obj->m_actionName << obj->m_lastIndex;
return out;
}
QDataStream &operator>>(QDataStream &in, QCustomAction* obj)
{
in >> obj->m_actionName >> obj->m_lastIndex;
return in;
}
之后,我的代码编译没有错误,我可以通过调用保存列表:
myQSettings.setValue("ActionsList",QVariant::fromValue<QList<QCustomAction*>>(someList));
我将值读作:
someList = myQSettings.value("ActionsList").value<QList<QCustomAction*>>();
读取值时出现内存错误。我的猜测是重载运算符存在一些问题。任何人都可以给我一个我做错的线索吗?
答案 0 :(得分:2)
让我解释一下。
例如:如果你保存一个int Qt将从你那里拿一个int,它会以某种方式将int存储到磁盘(由运营商)。另一方面,在加载时,Qt将创建一个int,从磁盘(通过运算符)加载其值并将该int返回给您。
对于你的指针,Qt将尝试以同样的方式执行:Qt将从你那里获取一个指针,它会以某种方式将指针存储到磁盘(由操作员 - 访问对象对应于那个指针)。另一方面,在加载时,Qt将创建一个未初始化的指针,并尝试从磁盘(由您的运营商)加载其值并将其返回给您。但是,它需要做的是创建一个对象来初始化指针。
您可能无法通过指针/引用存储/加载对象。始终只存储/加载按值复制对象!尝试将您的操作转换为按值复制的对象,然后存储/加载那种类型的对象。