QT中的字符串类型

QT的字符串类型

常用QString代替C++的String,QVariant可存放多种类型

语言 字符串类型
c char*
c++ string、char*
QT QByteArray、QString、QVariant

QByteArray

c语言中 char*的升级版本,其实就是对**char ***进行一次封装

常用的API

  • 构造函数:QByteArray::QByteArray(const char *data, int size = -1);

    • 将data中的size个字符进行构造, 得到一个字节数组对象, size==-1 函数内部自动计算字符串长度。
  • 数据操作:

    • 尾部追加数据:append、push_back

    • 头部追加数据:prepend、push_front

    • 插入数据:insert

    • 删除数据:remove、chpo、truncate、clear

      • 从字符串中删除len个字符, 从第pos个字符的位置开始删除
        QByteArray &QByteArray::remove(int pos, int len);

      • 尾部删除 n 个字节

        void QByteArray::chop(int n);

      • pos 位置将数组截断 (前边部分留下, 后边部分被删除)

      • void QByteArray::truncate(int pos);

  • 字符串替换:before 替换 after

    • QByteArray &QByteArray::replace(const QByteArray &before, const QByteArray &after);
  • 子字符串查找

    • 是否包含子字符串:bool QByteArray::contains(const QByteArray &ba) const;
    • 是否以字符串开始:bool QByteArray::startsWith(const QByteArray &ba) const;
    • 是否以字符串结尾:bool QByteArray::endsWith(const QByteArray &ba) const;
  • 类型转换

    • int, short, long, float, double -> QByteArray:setNumnumber
    • QByteArray -> int, short, long, float, double:toInt
    • string -> QByteArray:fromStdString
    • QByteArray -> string:toStdString
    • 转换为大写:toUpper

QString(常用)

QString:可以对QByteArray再进行一次封装,内部的编码为utf8

构造函数:

  • QString::QString(const char *str);

  • QString::QString(const QByteArray &ba);

常用API

  • 数据操作:append、push_back、prepend、push_front、insert、remove

  • 字符串替换:replace(const QString &before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive);

  • 子字符串查找:contains、startsWith、endsWith

  • 类型转换:同理

  • 字符串格式化:arg()

    c++ 复制代码
    Qstring str = Qstring("(%1)有(%2)个徒弟,分别是(%3),(%4),(%5)").arg("唐僧").arg(3).arg("孙悟空").arg("猪八戒").arg("沙僧");

QByteArray与QString的区别

  1. QString中可以通过arg函数进行动态拼接

  2. 计算字符串的长度不同

    原因:QString采用的是UTF-8编码,则每个字符的长度都是一致的。而QByteArray没有改变 char* 的编码。

c++ 复制代码
//计算对象中的字符串长度
// 长度是字符个数,一个汉字算一个字符
QString tmp ="我很帅呦,吼吼吼..", //len:12
// 长度是字符串占用的字节数,一个汉字3个字节
QByteArray tmp1 ="我很帅呦,吼吼吼..."; //len:26

QVariant

目的是对几种不同的数据类型进行传递。结构体不方便,容器则只能保存单一的数据类型。

QVariant 可以保存很多Qt的数据类型,包括QBrush、QColor、QCursor、QDateTime、QFont、QKeySequence、 QPalette、QPen、QPixmap、QPoint、QRect、QRegion、QSize、QString,并且还有C++基本类型,如 int、float等。

构造函数QVariant::QVariant(const QString &val);

常用API

  • 设置函数也可以将支持的类型的数据设置到QVariant对象中:

    • void QVariant::setValue(const T &value);

    • QVariant QVariant::fromValue(const T &value);

      c++ 复制代码
      QVariant v;
      v.setValue(5);
      //例子2
      QVariant v = QVariant::fromValue(5);
      int i = v.toInt();          // i is now 5
      QString s = v.toString();   // s is now "5"
  • 判断 QVariant中封装的实际数据类型QVariant::type() const;

    c++ 复制代码
    //传入QVariant两个参数,返回QVariant
    QVariant MainWindow::dataPlus(QVariant a, QVariant b) {
    	OVariant ret;// 判断当前参数的类型是字符串还是整形数
    	if(a.type()== QVariant::Int && b.type()== QVariant::Int)
    		ret = QVariant(a.toInt()+ b.toInt()); 
    }
  • 将QVariant对象转换为实际的数据类型QString QVariant::toString() const;

自定义类型如何使用QVariant封装

自定义的类型也可以使用QVariant类进行封装, 被QVariant存储的数据类型需要有一个默认的构造函数和一个拷贝构造函数。为了实现这个功能,首先必须使用Q_DECLARE_METATYPE()宏。

  1. 先使用Q_DECLARE_METATYPE(Type)宏声明自定义类
  2. 通过两种转换方法转成QVariant(``setValue 和 fromValue`)
  3. 使用时通过canConvert判断是否为自定义类型
  4. 通过value提取出QVariant的值
c++ 复制代码
// 自定义类型注册
Q_DECLARE_METATYPE(MyTest)
// 值的封装
QVariant vt = QVariant::fromValue(t);
// 值的读取
if(vt.canConvert<MyTest>())
{
    MyTest t = vt.value<MyTest>();
    qDebug() << "name: " << t.name << ", num: " << t.num;
}
c++ 复制代码
// 如果当前QVariant对象可用转换为对应的模板类型 T, 返回true, 否则返回false
bool QVariant::canConvert() const;
// 将当前QVariant对象转换为实际的 T 类型
T QVariant::value() const;
相关推荐
秋田君9 分钟前
SqlServer2022 服务以及客户端可视化安装详细教程
qt
运维行者_10 分钟前
预测性云监控怎么做?AI驱动的7大核心能力与落地路径
服务器·开发语言·网络·数据库·人工智能·python·php
_Narcissus_12 分钟前
B+树的概念和操作笔记(含完整代码实现)
c语言·数据结构·数据库·c++·笔记·b树·算法
aichitang202415 分钟前
快乐泛函每一天!内积空间
c++·python·数学·算法·机器学习·ai·泛函分析
智闲电子设计16 分钟前
STM32 外扩 QSPI Flash 实战:字库和开机图存不下,就把 W25Q64 映射成内存直接读
网络·stm32·嵌入式硬件
Ravikov18 分钟前
工具开发-ESP32程序管理系统 | 具体实现(一)
c++
嵌入式阿蔡29 分钟前
逻辑分析仪实战:从波形一眼看出 UART/SPI/I2C 通信错在哪
网络·stm32·单片机·嵌入式硬件·嵌入式实时数据库
地衣君34 分钟前
从 profile 到 kanban:Hermes 多 Agent 协作解析及示例
网络·数据库·tcp/ip
欧特克_Glodon1 小时前
OpenCV计算机视觉开发入门与实践<十六>:图像边框和图像轮廓
c++·人工智能·opencv·计算机视觉
wuminyu1 小时前
JDK21中FFM api的upcall回调机制解析
java·linux·c语言·jvm·c++