如何将QList <qvariant>转换为QList <t>

时间:2017-02-27 10:35:26

标签: qt

对于我的序列化方法,我需要在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>本身。

1 个答案:

答案 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();
}