• 8496阅读
  • 8回复

关于QTextStream或QDataStream使用的方法问题。发现最近这方面的问题很多 [复制链接]

上一主题 下一主题
离线318065268
 
只看楼主 倒序阅读 楼主  发表于: 2009-12-23
    如题,两个类的使用曾经也让我很困惑,差不多整了个把礼拜才最终明白其中的一点道道。现在看到好多学习者也碰到了这方面的问题,就把我的一些见解共享出来,希望能有所帮助。
    这两个类的名字中都有stream这个关键字,也就是“流”的意思。说到数据流,大部分都有自己的格式,比如数字电视的一堆标准。我猜测,这两个类就是为了方便这方面的应用。而我们自己使用的时候,尤其是传输网络数据,或者格式很多的数据的时候,也可以采用这个类。比如:

QByteArray data;
QDataStream in(data);
int i;
QString j;
QStringList k;
QPixmap m;
in << i << j << k << m;

数据很乱,很难用其它的方法去存储或传输,而使用QDataStream来做就会很方便,读取的时候我们可以这样(假定通过网络接收了这些数据):
QByteArray data = socked.readAll();
QDataStream out(data);
int i;
QString j;
QStringList k;
QPixmap m;
out >> i >> j >> k >> m;

这样就完成了一次很多格式或类型数据的传输了,我们获取到的i、j、k、m,虽然格式各不相同,但是使用QDataStream的方式来读取和输出,能够保证输出内容正是你输入的,同时使用也很方便,因为有这些方便的操作符使用。

既然这些数据类型或格式都不相同,那么可以想象,在我读取完i j k m这些数据后,肯定不会保持其原始状态,会自动加入一些东西,一方面要保证最后能够正确的读取,比如加上一些特殊的数据间的间隔符。甚至可能还会有一些压缩,这些不得而知,但总之可以这样简单的理解,当我们执行完 in << i << j << k << m; 的时候,data里面的数据,已经不会是原来那些数据的简单累加了,如果在这个时候要想打印其结果,要么打印不出来,要么不是原始的数据。

所以,当我们在调试的时候,如果出现数据显示不出来的问题,就看一下,是否是因为让我们的data在编码之后和解码之前显示。如果是,就调整一下,在别的位置将调试数据打印出来。

Email  rsail@126.com(私人邮箱)
QQ:   318065268
离线dbzhang800

只看该作者 1楼 发表于: 2009-12-23
楼主介绍的不错,
对于红字部分,我补充两点

1. QDataStream 操作的数据的格式,manual中有详细的介绍
http://qt.nokia.com/doc/4.6/datastreamformat.html

2. 要打印查看 QByteArray 中的数据,除非确信是可打印字符,否则先用 QByteArray::toHex () 转成16进制字符再打印是明智的
离线benbenmajia

只看该作者 2楼 发表于: 2009-12-23
LZ很好,希望以后可以多写这样的技术文档
安然.....
离线阳光不老

只看该作者 3楼 发表于: 2010-03-16
补充:

QByteArray data;      
//只读
QDataStream out(data);
//只写
QDataStream in(data, QIODevice::WriteOnly);
//设置字节序
in.setByteOrder(QDataStream::LittleEndian);
//确认字节长度
in << (quint16) uintNumber;
离线前世星辰
只看该作者 4楼 发表于: 2010-04-08
很有用,谢谢
I LIKE QT!!
离线babybluema

只看该作者 5楼 发表于: 2010-04-10
很好,收益匪浅
离线luoyes

只看该作者 6楼 发表于: 2010-04-10
mark
离线前世星辰
只看该作者 7楼 发表于: 2010-04-30
mark
I LIKE QT!!
离线cookinful
只看该作者 8楼 发表于: 2011-04-26
楼主总结的很好,谢谢分享!
快速回复
限100 字节
 
上一个 下一个