对于我的序列化方法,我需要在QVariantList中存储QList<T>
,其中T是我的自定义类型。
QList<T> l;
l.append(T());
QVariant var = QVariant::fromValue(l);
var.canConvert(QVariant::List); // returns true
//So i can easily iterate over the variant with sth like this:
QVariantList list;
QSequentialIterable it = var.value<QSequentialIterable>();
for (const QVariant &v : it)
list << v;
/* deserialization side */
var = list;
var.value<QList<T>>(); //returns an empty list which is not my serialized list;
我的问题是我无法将变体列表转换回QList<T>
修改
#define PROPERTY(type, name) \
Q_PROPERTY(type name MEMBER name) \
type name;
class Measurement
{
Q_GADGET
public:
PROPERTY(int, index)
PROPERTY(QString, name)
PROPERTY(QString, unit)
PROPERTY(double, factor)
PROPERTY(bool, isVisible)
PROPERTY(quint8, decimal)
bool operator ==(const Measurement &other)
{
return (this->index == other.index);
}
};
您可以将此类视为我的自定义类型(T)。我还保存了类名(此处为“Measurement”)以及序列化数据以供更进一步使用,因为您知道我们可以使用QMetaType :: type(char *)获取注册类型但是使用该类型我只能构造一个QVariant QVariant(int typeId,const void * copy)但是在这里我想构建QList<Measurement>
本身。
答案 0 :(得分:1)
您需要一次反序列化一个项目的QVariant列表。我也不确定这一行:
var = list;
正在执行您的预期。它将使用您的QVariantList list
并将其包装在另一个名为var
的QVariant中,其类型为QVariant(QVariantList, (QVariant(MyType, ), QVariant(MyType, )))
。这样做似乎没什么好处。
尽管如此,下面的示例显示了从var
恢复列表的方法。
#include <QCoreApplication>
#include <QVariant>
class MyType {
public:
MyType() {}
MyType(QString value) { m_value = value; }
QString m_value;
};
Q_DECLARE_METATYPE(MyType)
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QList<MyType> l;
l.append(MyType("foo"));
l.append(MyType("bar"));
QVariant var = QVariant::fromValue(l);
var.canConvert(QVariant::List); // returns true
//So i can easily iterate over the variant with sth like this:
QVariantList list;
QSequentialIterable it = var.value<QSequentialIterable>();
for (const QVariant &v : it)
list << v;
/* deserialization side */
var = list;
QList<MyType> deserializedList;
foreach(QVariant v, var.value<QVariantList>()) {
deserializedList << v.value<MyType>();
}
return a.exec();
}