`
qimo601
  • 浏览: 3452141 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Qt学习之路(51): QByteArray和QVariant

    博客分类:
  • Qt
阅读更多

转:http://devbean.blog.51cto.com/448512/276235

前面我们在介绍QString的最后部分曾经提到了QByteArray这个类。现在我们就首先对这个类进行介绍。

QByteArray具有类似与QString的API。它也有相应的函数,比如left(), right(), mid()等。这些函数不仅名字和QString一样,而且也具有几乎相同的功能。QByteArray可以存储原生的二进制数据和8位编码的文本数据。这句话怎么理解呢?我们知道,计算机内部所有的数据都是以0和1的形式存储的。这种形式就是二进制。比如一串0、1代码:1000,计算机并不知道它代表的是什么,这需要由上下文决定:它可以是整数8,也可以是一个ARGB的颜色(准确的说,整数8的编码并不是这么简单,但我们姑且这个理解吧)。对于文件,即便是一个文本文件,读出时也可以按照二进制的形式读出,这就是二进制格式。如果把这些二进制的0、1串按照编码解释成一个个字符,就是文本形式了。因此,QByteArray实际上是原生的二进制,但是也可以当作是文本,因此拥有文本的一些操作。但是,我们还是建议使用QString表示文本,重要的原因是,QString支持Unicode。

为了方便期间,QByteArray自动的保证“最后一个字节之后的那个位”是'\0'。这就使得QByteArray可以很容易的转换成const char *,也就是上一章节中我们提到的那两个函数。同样,作为原生二进制存储,QByteArray中间也可以存储'\0',而不必须是'\0'在最后一位。

在有些情况下,我们希望把数据存储在一个变量中。例如,我有一个数组,既希望存整数,又希望存浮点数,还希望存string。对于Java来说,很简单,只要把这个数组声明成Object[]类型的。这是什么意思呢?实际上,这里用到的是继承。在Java中,int和float虽然是原生数据类型,但是它们都有分别对应一个包装类Integer和Float。所有这些Integer、Float和String都是继承于Object,也就是说,Integer、Float和String都是一个(也就是is-a的关系)Object,这样,Object的数组就可以存储不同的类型。但是,C++中没有这样一个Object类,原因在于,Java是单根的,而C++不是。在Java中,所有类都可以上溯到Object类,但是C++中没有这么一个根。那么,怎么实现这么的操作呢?一种办法是,我们都存成string类,比如int i=10,我就存"10"字符串。简单的数据类型固然可以,可复杂一些的呢?比如一个颜色?难道要把ARGB所有的值都转化成string?这种做法很复杂,而且失去了C++的类型检查等好处。于是我们想另外的办法:创建一个Object类,这是一个“很大很大的”类,里面存储了几乎所有的数据类型,比如下面的代码:

  1. class Object  
  2. {  
  3. public:  
  4.     int intValue;  
  5.     float floatValue;  
  6.     string stringValue;  
  7. }; 

这个类怎么样?它就足以存储int、float和string了。嗯,这就是我们的思路,也是Qt的思路。在Qt中,这样的类就是QVariant

QVariant可以保存很多Qt的数据类型,包括QBrush、QColor、QCursor、QDateTime、QFont、QKeySequence、QPalette、QPen、QPixmap、QPoint、QRect、QRegion、QSize和QString,并且还有C++基本类型,如int、float等。QVariant还能保存很多集合类型,如QMap<QString, QVariant>, QStringList和QList<QVariant>。item view classes,数据库模块和QSettings都大量使用了QVariant类,,以方便我们读写数据。

QVariant也可以进行嵌套存储,例如

  1. QMap<QString, QVariant> pearMap;  
  2. pearMap["Standard"] = 1.95;  
  3. pearMap["Organic"] = 2.25;  
  4.  
  5. QMap<QString, QVariant> fruitMap;  
  6. fruitMap["Orange"] = 2.10;  
  7. fruitMap["Pineapple"] = 3.85;  
  8. fruitMap["Pear"] = pearMap; 

QVariant被用于构建Qt Meta-Object,因此是QtCore的一部分。当然,我们也可以在GUI模块中使用,例如

  1. QIcon icon("open.png");  
  2. QVariant variant = icon;  
  3. // other function  
  4. QIcon icon = variant.value<QIcon>(); 

我们使用了value<T>()模版函数,获取存储在QVariant中的数据。这种函数在非GUI数据中同样适用,但是,在非GUI模块中,我们通常使用toInt()这样的一系列to...()函数,如toString()等。

如果你觉得QVariant提供的存储数据类型太少,也可以自定义QVariant的存储类型。被QVariant存储的数据类型需要有一个默认的构造函数和一个拷贝构造函数。为了实现这个功能,首先必须使用Q_DECLARE_METATYPE()宏。通常会将这个宏放在类的声明所在头文件的下面:

  1. Q_DECLARE_METATYPE(BusinessCard) 

然后我们就可以使用:

  1. BusinessCard businessCard;  
  2. QVariant variant = QVariant::fromValue(businessCard);  
  3. // ...  
  4. if (variant.canConvert<BusinessCard>()) {  
  5.     BusinessCard card = variant.value<BusinessCard>();  
  6.     // ...  

由于VC 6的编译器限制,这些模板函数不能使用,如果你使用这个编译器,需要使用qVariantFromValue(), qVariantValue<T>()和qVariantCanConvert<T>()这三个宏。

如果自定义数据类型重写了<<和>>运算符,那么就可以直接在QDataStream中使用。不过首先需要使用qRegisterMetaTypeStreamOperators<T>().宏进行注册。这就能够让QSettings使用操作符对数据进行操作,例如

  1. qRegisterMetaTypeStreamOperators<BusinessCard>("BusinessCard"); 

本文出自 “豆子空间” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/276235

分享到:
评论

相关推荐

    Qt中QString、QByteArray、int、double之间转换 - 苦涩的茶 - 博客园1

    总结来说,Qt提供了便捷的方法在QString、QByteArray、int和double之间进行转换,这在处理各种数据类型时非常有用。在实际编程中,根据需求选择合适的转换方式,并注意检查转换的正确性,以确保数据的准确无误。

    Qt学习之路.pdf

    - **知识点**:QString类的使用、QByteArray和QVariant的介绍。 - **重要性**:字符串处理是几乎所有应用程序都会涉及的基本操作,而QString类提供了丰富的功能来简化这一过程。 通过以上总结可以看出,《Qt学习...

    QT学习之路

    标题《QT学习之路》指明了文档的主要内容,即向读者介绍如何学习Qt这一跨平台的C++图形用户界面应用程序开发框架。Qt是一个功能强大的工具,能够用来开发具有图形用户界面的应用程序,并且支持多种操作系统平台,如...

    Qt学习之路---尤其适用Qt初学者

    20. **QByteArray和QVariant** —— 学习这两种数据类型的特点和用途。 21. **拖放技术** —— 探讨Qt中的拖放机制,了解如何为应用程序添加拖放功能。 22. **剪贴板操作** —— 介绍如何在Qt应用程序中实现复制、...

    这里提供两种加解密的方法。 第一种方法:使用QByteArray的toBase64和fromBase64来实现。 第二种方法:使

    这里提供两种加解密的方法。 第一种方法:使用QByteArray的toBase64和fromBase64来实现。 第二种方法:使用base64.cpp文件中的base64_encode和base64_decode来实现。

    Qt基础开发之QString与QByteArray详细用法与区别及QString QByteArray互转

    Qt基础开发之QString与QByteArray详细用法与区别及QString QByteArray互转 Qt基础开发中的QString与QByteArray是两个非常重要的类,它们都可以用来处理字符串或字节流,但是它们之间有着很大的区别。 首先,...

    Convert from qint32 to qbytearray

    ### Qt4 中 qint32 转换为 QByteArray 的方法 在Qt开发中,经常需要进行不同类型之间的数据转换,特别是当涉及到网络传输或文件存储时。本篇文章将详细介绍如何在Qt4环境中将`qint32`类型的数据转换为`QByteArray`...

    QT C++ QByteArray 默认值在debug与release下的差异

    QT C++库中的`QByteArray`是一个非常常用的类,它提供了对字节序列的操作和管理。这个类在处理二进制数据或者简单的文本字符串时非常方便。然而,一个有趣的现象是,`QByteArray`的默认值在调试(debug)模式和发布...

    适用于Qt4、Qt5的开源json处理库

    基于“开源json处理库cJSON”,采用Qt进行二次封装,与QByteArray、QVariant类相结合,比Qt5自带的Qt处理库方便简单。 Github地址:https://github.com/croxs-power/QJson.git

    QT5.1.1QbyteArray转int32

    做这个转换每每耗费很多时间,分大小端写了两个函数,测试正确,记录一下,以后直接就用了,也分享给有需要的小伙伴

    兼容、适配QT的压缩 qCompress 和 解压 qUncompress 函数

    这是为了适配QT压缩 qCompress 和 解压 qUncompress 函数而修改的文件, * 本代码中的 zCompress 函数对应QT的 qCompress; * 本代码中的 zUncompress 函数对应QT的 qUncompress; * QT的 QByteArray 用 ZByteArray...

    QDB2_qbytearry删除_QByteArray删除_qbytearray截取_测试QBYTEARRAY_源码.zip

    通过阅读和理解这些源码,我们可以更深入地学习如何在实际项目中应用`QByteArray`的相关功能。 5. **应用场景**: `QByteArray`广泛应用于需要高效处理字节序列的场景,如网络通信(接收和发送数据)、文件读写、...

    QT调用python,并给python传递Mat矩阵和二维数组

    在IT领域,跨语言通信是常见的需求,这里我们讨论的是如何使用QT(一种C++的图形用户界面应用程序开发框架)调用Python脚本,并传递数据,如OpenCV中的Mat矩阵和二维数组。这个过程涉及到了多语言接口设计、数据类型...

    Qt设计在线音乐播放器支持本地播放(music-player)源代码.zip

    Qt设计在线音乐播放器支持本地播放(music_player)源代码,Qt中提供了音视频播放的类,类中提供了很多播放类的接口供调用,可以实现一个完整播放器的所有功能。 class online_play : public QWidget { Q_OBJECT ...

    QDB2_qbytearry删除_QByteArray删除_qbytearray截取_测试QBYTEARRAY.zip

    在Qt库中,QByteArray是一种非常重要的数据类型,它用于处理和存储字节序列。QByteArray既可以作为字符串处理,又可以作为二进制数据处理,这使得它在各种场景下都十分灵活。在这个主题中,我们将深入探讨QByteArray...

    QByteArray_Uchar.C

    QByteArray完美数据类型转换成uchar uint8_t,核心代码代码就三行,但是非常好用。Linux和windows下均测试通过

    Qt访问百度语音识别服务器,简单测试程序

    Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动和嵌入式设备。在本例中,我们将利用Qt 5.11版本(推荐使用不低于Qt 5.8的版本)与百度语音识别API进行交互,以便在Windows 10环境下实现语音识别功能。 ...

    Qt之 Post方法上传图片到服务器两种方式Base64流和File

    在Qt中,可以使用`QByteArray`和`QBuffer`来处理二进制数据,然后使用`QByteArray`的`toBase64()`方法进行编码。以下是具体步骤: 1. 读取图片文件到`QByteArray`,可以使用`QFile`和`QDataStream`。 2. 对`...

Global site tag (gtag.js) - Google Analytics