首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将QList<QVariant>转换为QList<T>

如何将QList<QVariant>转换为QList<T>
EN

Stack Overflow用户
提问于 2017-02-27 10:35:26
回答 1查看 5.6K关注 0票数 2

对于我的序列化方法,我需要将QList<T>存储在QVariantList中,其中T是我的自定义类型。

代码语言:javascript
复制
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>

编辑:

代码语言:javascript
复制
#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>本身。

EN

回答 1

Stack Overflow用户

发布于 2017-02-27 11:07:10

您将需要反序列化QVariant列表一次一个项。我也不确定这一行:

代码语言:javascript
复制
var = list;

正在实现你的目标。它将接受您的QVariantList list,并将其包装到另一个名为var的QVariant中,该QVariant的类型为QVariant(QVariantList, (QVariant(MyType, ), QVariant(MyType, )))。这样做似乎没有多大好处。

尽管如此,下面的示例显示了从var中恢复列表的方法。

代码语言:javascript
复制
#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();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42483502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档