8

我可能写错了,但这是我试图执行的代码,但它没有达到预期的效果:

#include <QDataStream>
#include <QByteArray>
#include <QVariant>
#include <iostream>


int main(){

    QByteArray data;
    QDataStream ds(&data,QIODevice::WriteOnly);
    QVariant v(123);
    ds << v;
    std::cout <<"test: " <<  data.data() << std::endl; // "test: 123"


    return 0;
}

鉴于 QVariant 类的文档中的示例:

http://qt-project.org/doc/qt-5.1/qtcore/qvariant.html#type

它应该将值 123 正确序列化到 QByteArray 但不这样做,而是只写出:

test: 

有人知道如何解决这个问题吗?

编辑

好吧,也许不清楚,但这是最初的问题:

我可能在 QVariant 中存储了任何 QVariant 内置类型,例如 QStringList、QString、double、int 等。

我想要的是一种将 QVariant 序列化为字符串并恢复它的方法,而无需自己为每种类型执行此操作。据我所知,QVariant::toString() 方法不适用于通过 QVariant 接受的所有类型,我认为通过 QDataStream 传递可以传递给我 QVariant 的序列化版本。

编辑 2

感谢 piotruś 的回答,我能够回答我的问题。这是程序:

int main(){
    QString str;
    {
        //serialization
        QByteArray data;
        QDataStream ds(&data,QIODevice::WriteOnly);
        QVariant v(123);
        ds << v;
        data = data.toBase64();
        str = QString(data);
        cout << str.toStdString() << endl;

    }
    {
        //deserialization
        QByteArray data = str.toLatin1();
        data = QByteArray::fromBase64(data);
        QDataStream ds(&data,QIODevice::ReadOnly);
        QVariant v;
        ds >> v;
        cout << v.toInt() << endl;
    }

    return 0;
}
4

2 回答 2

4

QDataStream不写入文本,它以此处指定的格式写入二进制数据。所以你不应该期望在字节数组中看到任何可打印的字符,当然也不是数字的字符串表示形式。

QTextStream用于写出文本,但它不直接兼容QVariant. 您需要编写自己的代码来测试变体包含的类型并写出适当的字符串。

于 2013-10-23T09:06:03.293 回答
4
QByteArray data;
QDataStream dsw(&data,QIODevice::WriteOnly);
QVariant v(123);
dsw << v;

QDataStream dsr(&data,QIODevice::ReadOnly);
QVariant qv;
dsr>>qv;
qDebug()<<qv.toString();

但是,您的数据 123 已经写入QByteArray。如果您尝试调试它,该点QByteArray被存储为内存中的数组将不会显示“123”,但会显示“{”而不是代码 123 的ASCII字符。您仍然可以从原始内存中打印此 QByteArray。你会这样做:char

const char *dataPtr = data.operator const char *();
     int i=0;
     while (i<9) {
         std::cout << "[" << *dataPtr << "]";
         ++dataPtr;
         ++i;
     }

输出为: [] [] [] [] [] [] [] [] [ { ]

你可能想做`

data.setByteOrder( QDataStream::LittleEndian );

从以小端顺序存储的流中打印字节。

于 2013-10-23T09:08:51.750 回答