首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用已知的QMetaType::Type到QVariant反序列化QVariant

用已知的QMetaType::Type到QVariant反序列化QVariant
EN

Stack Overflow用户
提问于 2020-08-07 10:17:08
回答 2查看 194关注 0票数 2

我有一个包含变量原始数据的QByteArray

描述变量的QMetaType::Type是已知的。

我想将这个变量反序列化为一个QVariant

有以下投入:

代码语言:javascript
复制
QByteArray bytes; // Consider it initialized
QMetaType::Type type; // Same

到目前为止,我的尝试并没有奏效:

代码语言:javascript
复制
QVariant var{bytes};
var.convert(type); // Does not work, apparently QVariant expects bytes to be a string representation of the variable
代码语言:javascript
复制
QDataStream ds(bytes, QIODevice::ReadOnly);
QVariant var;
ds >> var; // Does not work because bytes does not come from the serialization of a QVariant (especially, it lacks type information)

我不能更改输入或输出类型:

输入必须是QMetaType::Type.

  • The类型,而QMetaType::Type.

  • The输出必须是QVariant

类型

例子:

代码语言:javascript
复制
//Inputs
QByteArray bytes = { 0x12, 0x34, 0x56, 0x78 };
QMetaType::Type type = QMetaType::UInt; // Suppose the size of unsigned int is 4 bytes (could be 2)
// Note: this is an example, in pratice I have to manage many types, including double

//Expected output:
QVariant var = deserialize(bytes, type);
// var.type() == QMetaType::UInt
// var.toUInt() == 305419896 (== 0x12345678)
EN

回答 2

Stack Overflow用户

发布于 2021-01-18 13:51:16

面对同样的问题,我使用提供的类型id直接通过QByteArraydata()方法从QByteArray构建data()

代码语言:javascript
复制
QByteArray bytes; // Consider it initialized
QMetaType::Type type; // Same
QVariant result(type.id(),bytes.data());

如果构造失败,您将得到一个无效的QVariant,但到目前为止,对于我的类型,它工作得很好。

票数 1
EN

Stack Overflow用户

发布于 2020-08-07 10:56:26

您可以将其写入unsigned int,然后将其转换为QVariant

代码语言:javascript
复制
    const char data[] = { 0x12, 0x34, 0x56, 0x78 };
    QByteArray bytes { QByteArray::fromRawData( data, 4) };

    QDataStream s {&bytes, QIODevice::ReadOnly};
    //write out the data to uint
    unsigned int x{};
    s >> x;

    //create a Qvariant from it
    QVariant var{x};

    qDebug () << "x: " << x;                       //305419896
    qDebug () << "variant: " << var;               //QVariant(uint, 305419896)
    qDebug () << "variant uint: " << var.toUInt(); //305419896

或者,您也可以直接构造一个QVariant

代码语言:javascript
复制
    auto v = QVariant(bytes.toHex().toUInt());
    //auto v = QVariant(bytes.toUInt());            //this will not work
    qDebug () << "Bytes to uint; " << v.toUInt(); //305419896
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63299770

复制
相关文章

相似问题

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