对于我的序列化方法,我需要将QList<T>存储在QVariantList中,其中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)。我还保存类名(此处为“度量衡”)以及用于进一步使用的序列化数据,因为如您所知,我们可以使用QMetaType:: type (char*)获得已注册的类型,但使用该类型,我只能使用QVariant(int typeId,const typeId* QList<Measurement> )构造一个QList<Measurement>,但是这里我想构造QList<Measurement>本身。
发布于 2017-02-27 11:07:10
您将需要反序列化QVariant列表一次一个项。我也不确定这一行:
var = list;正在实现你的目标。它将接受您的QVariantList list,并将其包装到另一个名为var的QVariant中,该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();
}https://stackoverflow.com/questions/42483502
复制相似问题