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;
相关推荐
Antonio91510 分钟前
【opencv】第8章 图像轮廓与图像分割修复
c++·人工智能·opencv·计算机视觉
来自于狂人1 小时前
隧道网络:为数据传输开辟安全通道
网络·计算机网络·安全
小庞在加油1 小时前
【C++开源库】Boost.Asio网络库使用介绍
网络·c++·开源·boost网络库
木人舟1 小时前
在VMware配置Ubuntu20.04静态ip的方法
网络·网络协议·tcp/ip
陌然。。1 小时前
【39. 组合总和 中等】
数据结构·c++·笔记·算法·leetcode
MC何失眠2 小时前
vulnhub靶场【DC系列】之7
网络·学习·安全·web安全·网络安全
一张假钞2 小时前
解决HTTP POST请求Nginx静态内容405错误
网络·网络协议·http
IPdodo全球网络服务2 小时前
ChatGPT 网络配置问题解决方案
网络·chatgpt
神一样的老师2 小时前
【行空板K10】上传温湿度信息到EasyIoT平台
网络·嵌入式硬件·物联网·青少年编程
dog2503 小时前
互联网架构变迁:从 TCP/IP “呼叫” 到 NDN “内容分发” 的逐浪之旅
网络·tcp/ip·架构