QT之QString学习笔记

QString

结合网络博客和QT文档总结而成。

1、概述
1.1 QString 类是 Qt 中用于表示字符串的类,实现在 QtCore 共享库中。QString 类在实现上有以下特征:

1)字符串采用 Unicode 内部编码,可以表示世界上大多数语言的文字;
2)字符串的存储有引用计数,当一个 QString 对象被复制为另一个 QString 对象时,它们实际上指向相同的存储空间,仅仅是增加一个引用计数;
3)隐式共享:采用隐式共享,只要不涉及到写的时候所有公用的只指向一个内存区域,只有在写的时候才进行写时复制。这一点和操作系统的写时复制类似。
注意:QT中还有很多的类似类,都是采用的隐式共享机制,本人在开发的时候就吃过由隐式共享带来的bug,原因不了解该机制,也不熟悉,然后使用了.detach()才解决。

编辑操作

定义了一个QString字符串以后,经常用的操作会控制字符串中的一些内容,这就和数据库一样,经常会有一些增删改查的需求,只不过这些需求会更加细粒度的划分出来怎么去操作

比如:
增:
在字符串的前(prepend())和 后(append())添加字符串或者字符;
insert()在指定位置添加字符串或者字符;

remove()在指定位置移除多个字符串;
trimmed()除去字符串两端的空白字符,包括"\t" “\n” “\v” “\f” “\r” “” ;
simplified()在除去字符串两端空白字符的同时,并且将字符串中间的空白字符序列替换为一个空格。

split()将一个字符串分割成多个子字符串;
“+” 使用+操作符来组合两个字符串。

contains() 函数判断该字符串是否包含一个指定的字符或者字符串;
count() 获得字符串中的一个字符或者子字符串出现的次数。

注意:
isNull()和isEmpty()是有区别的,如果遇到空字符,isNull()是判断为false,isEmpty()判定为true;一般使用isEmpty()来判断字符串是否为空,使用isNull判断是不够准确的。

#include <QCoreApplication>
#include <QDebug>
#include <QStringList>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug() << QObject::tr("以下是编辑字符串操作:") << endl;

    QString str = "hello";
    // 执行下面一行代码,大小为5
    qDebug() << QObject::tr("字符串大小:") << str.size();
    str[0] = QChar('H');      								// 将第一个字符换为‘H'
    // 执行下面一行代码,结果为‘H'
    qDebug() << QObject::tr("第一个字符:") << str[0];        //Hello
    str.append(" Qt");        								// 向字符串后添加"Qt" Hello Qt
    qDebug() << QObject::tr("str为:") << str;
    str.replace(1,4,"i");     								// 将第1个字符开始的后面4个字符替换为字符串"i"是第一到第四个这四个仅用一个i代替 (Hiiii Qt错误)
    qDebug() << QObject::tr("str为:") << str;
    str.insert(2," my");      								// 在第2个字符后插入" my"Hi myiii Qt
    // 执行下面一行代码,结果为Hi my Qt
    qDebug() << QObject::tr("str为:") << str;
    str = str + "!!!";        								// 将两个字符串组合
    // 执行下面一行代码,结果为Hi my Qt!!!
    qDebug() << QObject::tr("str为:") << str;

    str = " hi\r\n                                    Qt!\n  ";
    qDebug() << QObject::tr("str为:") << str;
    QString str1 = str.trimmed();    						// 除去字符串两端的空白字符
    qDebug() << QObject::tr("str1为:") << str1;
    QString str2 = str.simplified(); 						// 除去字符串两端和中间多余的空白字符
    //结果为hi Qt!
    qDebug() << QObject::tr("str2为:") << str2;

    str = "hi,my,,Qt";
    // 从字符串中有","的地方将其分为多个子字符串,
    // QString::SkipEmptyParts表示跳过空的条目
    QStringList list = str.split(",",QString::SkipEmptyParts);
    // 执行下面一行代码,结果为hi,my,Qt
    qDebug() << QObject::tr("str拆分后为:") << list;
    str = list.join(" "); 									// 将各个子字符串组合为一个字符串,中间用" "隔开
    // 执行下面一行代码,结果为hi my Qt
    qDebug() << QObject::tr("list组合后为:") << str;

    qDebug() << QString().isNull();     // 结果为true
    qDebug() << QString().isEmpty();    // 结果为true
    qDebug() << QString("").isNull();   // 结果为false
    qDebug() << QString("").isEmpty();  // 结果为true

	QString text = " zj 999 ";
    text = text.trimmed();//去除字符的前后空格
    qDebug() << "text = " << text;
   int i = text.count(' ');
   qDebug() << "i = " << i;
    if (i != 1)
    {
        text = text.replace(QRegExp("\\s+"), " ");//多个空格合并成一个空格
        //text = text.simplified(); 			 // 除去字符串两端和中间多余的空白字符(也可多个空格合并成一个空格)
        qDebug() << "1 text = " << text;
    }
    else
    {
        text = text.remove(QRegExp("\\s+"));
        qDebug() << "2 text = " << text;
    }
    return a.exec();
}

下标查询

上面的操作字符串增加操作中,更加细粒度操作一点,具体到每一个位置的操作
right()、left()、mid()、分别提取一个字符串最右面、最左面、中间含有多个字符的子字符串;
indexOf()函数获取一个字符或者子字符串在该字符串中的位置;
at()函数获取一个指定位置的字符,比" [ ] "操作符要快很多,不会引发深拷贝;
startsWith()和endsWidth()函数判断该字符串是以一个字符或者字符串开始或者结束的;
%1……n的显示方式。

#include <QCoreApplication>
#include <QDebug>
#include <QStringList>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug() << endl << QObject::tr("以下是在字符串中进行查询的操作:") <<endl;
    QString str = "Bananas";
    qDebug() << QObject::tr("字符串为:") << str;
    // 结果为Bananas
    qDebug() << QObject::tr("包含右侧5个字符的子字符串:") << str.right(5);
    // 结果为nanas
    qDebug() << QObject::tr("包含左侧5个字符的子字符串:") << str.left(5);
    // 结果为ana
    qDebug() << QObject::tr("包含第1个字符以后3个字符的子字符串:") << str.mid(1, 3);
    //结果为0
    qDebug() << QObject::tr("'Bana'的位置:") << str.indexOf("Bana");
    //结果为B
    qDebug() << QObject::tr("str的第0个字符:") << str.at(0);
    //结果为2
    qDebug() << QObject::tr("str中'a'字符的个数:") << str.count('a');
    // 结果为true
    qDebug() << QObject::tr("str是否以”B“开始?") << str.startsWith("B");
    // 结果为false
    qDebug() << QObject::tr("str是否以”a“结尾?") << str.endsWith("a");
    // 结果为true
    qDebug() << QObject::tr("str是否包含”anan“字符串?") << str.contains("anan");

    QString temp = "hello";
    // 两字符串进行比较
    if(temp > str)
        qDebug() << temp;
    else
        qDebug() << str;
    return a.exec();
}

关于数字转换显示和 使用“%1”和arg()的显示方式


    qDebug() << endl << QObject::tr("以下是字符串的转换操作:") << endl;
    str = "100";
    // 结果为100
    qDebug() << QObject::tr("字符串转换为整数:") << str.toInt();
    int num = 45;
    //结果为"45"
    qDebug() << QObject::tr("整数转换为字符串:") << QString::number(num);
    str = "FF";
    bool ok;
    int hex = str.toInt(&ok, 16);
    // 结果为ok:true 255
    qDebug() << "ok: "<< ok << QObject::tr("转换为十六进制:") << hex;
    num = 26;
    //结果为1a
    qDebug() << QObject::tr("使用十六进制将整数转换为字符串:")<< QString::number(num, 16);
    str = "123.456";
    //结果为123.456
    qDebug() << QObject::tr("字符串转换为浮点型:") << str.toFloat();
    str = "abc";
    // 结果为ABC
    qDebug() << QObject::tr("转换为大写:") << str.toUpper();
    str = "ABC";
    // 结果为abc
    qDebug() << QObject::tr("转换为小写:") <<str.toLower();

 	int num1 = 25;
    QString st1 = "cs";
    // st1代替%1,age代替%2
    str = QString("st1 is %1, num1 is %2").arg(st1).arg(num1);

    qDebug() << QObject::tr("%1 %2的str为:") << str;
    str = "%1 %2";
    // 结果为%1f hello
    qDebug() << str.arg("%1f","hello");
    // 结果为hellof %2
    qDebug() << str.arg("%1f").arg("hello");
    str = QString("ni%1").arg("hi",5,'*');
    //结果为ni***hi
    qDebug() << QObject::tr("设置字段宽度为5,使用'*'填充:") << str;
    qreal value = 123.456;
    str = QString("number: %1").arg(value,0,'f',2);
    //结果为"number:123.45
    qDebug() << QObject::tr("设置小数点位数为两位:") << str;
    // 执行下面一行代码,结果为number:123.45不会显示引号
    qDebug() << QObject::tr("将str转换为const char* :") << qPrintable(str);
    

以上最常见的几种使用方法,几乎在所有项目中我都涉及到上述使用QString的方法,当然,后面还会继续补充。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值