文章目录

  • a) enum Qt::CaseSensitivity 大小写敏感
  • 一、合并
  • 二、替换:replace(有多个重载)
  • 1.其他重载:(个人认为常用的)
  • 三、分割/截取:
  • 1.split(有多个重载)
  • enum QString::SplitBehavior
  • 2.section 分割(有多个重载)
  • 3.向左、向右、中间截取
  • 3. 1 向左截取 left():
  • 3. 2 向右截取 right():
  • 3. 3 中间截取 mid()
  • 四、比较:compare(有多个重载)
  • 1.静态函数:(列举一个)
  • 2.普通成员函数:(列举一个)
  • 五、去空白:
  • 1.simplified() (去除两边,将内部空白替换成空格)
  • 2.trimmed() (去除两边)
  • 3.使用正则表达式(完全去除)
  • 4.for循环去除(完全去除)
  • 六、其他
  • 1.转小写 toLower()
  • 2.转大写 toUpper()
  • 3.字符串是否为空 isEmpty()
  • 4.字符串是否为空 isNull()
  • 5.填充字符(填满):
  • 6.是否包含该字符串(有多个重载)
  • 7.是否以该字符串结尾(有多个重载)
  • 8.是否以该字符串开头(有多个重载)
  • 9.QFontMetrics类:字体度量信息
  • 9.1构造函数:列举一个
  • 9.2 获取字符串绘制矩形

字符串常用的功能,合并、替换、分割、比较、去空白等。

a) enum Qt::CaseSensitivity 大小写敏感

Constant

Description

Qt::CaseSensitive

区分大小写,大小写敏感

Qt::CaseInsensitive

不区分大小写,大小写不敏感

一、合并

重载运算符“ + ” 和 “ += ” 都可以实现字符串的合并。

例子:

QString name = "LiHua";

    QString str = name + "Hao";		//LiHuaHao
	//Qstring str1 = "ni" + "ha";	//不可以这样子
    name += str;					//LiHuaLiHuaHao

二、替换:replace(有多个重载)

QString & QString::replace(int position, int n, const QString & after)

将从索引(从0开始)position开始的n个字符替换为after,并返回对该字符串的引用。
注意:如果指定的位置索引在字符串中,但是位置+ n超出了字符串范围,那么n将被调整为在字符串末尾停止

例子:

QString name = "LiHua";

    name.replace(2,3,"Wei");

    qDebug() << name;	//LiWei

1.其他重载:(个人认为常用的)

QString & QString::replace(const QString & before, const QString & after, Qt::CaseSensitivity cs = Qt::CaseSensitive)

若字符串中包含before字符串,那么将使用after字符串将其替换,第三个参数设置是否大小写敏感,默认大小写敏感

三、分割/截取:

1.split(有多个重载)

QStringList QString::split(const QString & sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive) const

  1. 第一个参数是分隔符(以什么分割),第二个参数默认支持结果出现空条目(空格不算空条目),第三个参数是匹配大小写敏感,默认大小写敏感。
  2. 注意:当分隔符没有与之相匹配的时候,会将字符串作为QStringList的一个数组数据即QStringList[0]

enum QString::SplitBehavior

Constant

Description

QString::KeepEmptyParts

如果字段为空,允许将其保留在结果中

QString::SkipEmptyParts

如果字段为空,不将其保留在结果中

例子:

QString name = "Li,,Hua";
    QStringList list = name.split(',');
    for(int i = 0;i < list.size();i++)
    {
        qDebug() << list[i];
    }
    //"Li"
    //""
    //"Hua"
    
    //当将第二个参数设置为不允许出现空条目的时候(空格不算空条目),运行结果如下
    list = name.split(',',SkipEmptyParts);
    for(int i = 0;i < list.size();i++)
    {
        qDebug() << list[i];
    }
    //"Li"
    //"Hua"

2.section 分割(有多个重载)

QString QString::section(QChar sep, int start, int end = -1, SectionFlags flags = SectionDefault) const

sep为分隔符,start是开始位置,end是结束位置(默认值时后面所有都匹配),flags影响函数行为的某些方面,例如是否区分大小写、是否跳过空字段以及如何处理开头和结尾分隔符

例子:

QString name = "Li,Hua,shi,gE,hao,Ren";

	qDebug() << name.section(',',4);		//hao,Ren

    qDebug() << name.section(',',0,0);      //Li

    qDebug() << name.section(',',0,2);      //Li,Hua,shi

    qDebug() << name.section(',',2,2);      //shi

    qDebug() << name.section(',',-1,-1);    //Ren

    qDebug() << name.section(',',-3,-1);    //gE,hao,Ren

3.向左、向右、中间截取

3. 1 向左截取 left():

QString QString::left(int n) const

在最左边开始截取n个字符,组成字符串返回。如果n小于0或者大于size()将返回整个字符串,等于0的时候为空。

例子:

QString name = "LiHua";

    qDebug() << name.left(3);		//LiH

3. 2 向右截取 right():

QString QString::right(int n) const

从右边往左截取n个字符,组成字符串返回。如果n小于0或者大于size()将返回整个字符串,等于0的时候为空。

例子:

QString name = "LiHua";

    qDebug() << name.right(3);		//Hua

3. 3 中间截取 mid()

QString QString::mid(int position, int n = -1) const

从position的位置开始,截取n个字符,若n为默认值获取,position后面全部内容(包括position)

例子:

QString name = "LiHua";
	
    QString myname = name.mid(2,4);
    
    qDebug() << myname;	//"Hua"
	
	QString myname = name.mid(1);
	
	qDebug() << myname;	//"iHua"

四、比较:compare(有多个重载)

1.静态函数:(列举一个)

int QString::compare(const QString & s1, const QString & s2, Qt::CaseSensitivity cs = Qt::CaseSensitive) [static]

比较s1和s2,s1 < s2:返回一个小于零的整数;s1 > s2:返回一个大于零的整数;s1 == s2:返回一个0。

例子:

//Qt::CaseSensitive     //大小写敏感
    //Qt::CaseInsensitive   //大小写不敏感
    int x = QString::compare("c", "b", Qt::CaseSensitive);
    qDebug() << x;	//1

2.普通成员函数:(列举一个)

int QString::compare(const QString & other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const

例子:

//Qt::CaseSensitive     //大小写敏感
    //Qt::CaseInsensitive   //大小写不敏感
    QString a = "aaa";
    QString b = "aaa";

    qDebug() << a.compare(b,Qt::CaseSensitive);		//0

当然也可以直接使用 “ == ” 来进行比较

例子:

if(a == b)
    {
        qDebug() << "ok";
    }
    else
    {
        qDebug() << "no";
    }

五、去空白:

去空白我整理了一下,一共有两个QT函数,一种使用正则表达式,一种自己写一个for循环进行去除空白。

1.simplified() (去除两边,将内部空白替换成空格)

QString QString::simplified() const

去除字符串前后空白(源数据不受影响):内部的将内部空白替换成空格

例子:

QString name = " Li\t Hua ";
	
	qDebug() << name.simplified();              //"Li Hua"

2.trimmed() (去除两边)

QString QString::trimmed() const

去除字符串前后空白(源数据不受影响):保留内部空白

例子:

QString name = " Li\t Hua ";
	//这个与上面的simplified()又有很大不同,这个trimmed()函数中间部分的空白将保留。
	qDebug() <<  name.trimmed();                //"Li	 Hua"

3.使用正则表达式(完全去除)

这里使用到了QString的remove方法,remove方法有多个重载哦,这次用的是下方这个

QString & QString::remove(const QRegExp & rx)

将正则表达式匹配到的进行删除

例子:

QString name = " Li\t Hua ";
	
	//" \s " 匹配任何空白字符,包括空格、制表符、换页符等等。
   	//等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。
   	
	qDebug() << name.remove(QRegExp("\\s"));    //"LiHua"

4.for循环去除(完全去除)

在这里用到了QString的remove方法,上面已经用到一个,这次用的是另一个重载函数

QString & QString::remove(int position, int n)

根据下标进行删除,n为删除个数,下标从0开始

在for循环里面还使用了另一个方法QChar::isSpace(),这个方法不属于QString,他是属于QChar的。

bool QChar::isSpace() const

机翻官方:如果字符是分隔符(Separator_* categories或Other_Control类别中的某些代码点),这包括ASCII字符’ \ t ', ’ \ n ', ’ \ v ', ’ \ f’,‘\ r’,‘’。则返回true;否则返回假
我的理解:匹配空白符,即根 \s 差不多的效果。

例子:

//'空格'Li\t'空格''空格'Hua'空格'
	QString name = " Li\t  Hua ";
	
	for(int i = 0;i < name.size(); i++)
    {
        //bool QChar::isSpace() const   //匹配空格制表符等(分隔符)就返回true。
        if(name[i].isSpace())
        {
            //qDebug() << "i = " << i << "name[" << i << "] = " << name[i];
            name.remove(i,1);
            i--;
			
			//在上方为什么要i--,当没有i--的时候,中间会留下一个空格。为了解决这个问题,
			//我调试发现它的下标,经过一次删除之后下标会减1,同时i的值也会跟着一起变化,
			//第一个空格name[0],remove后,第二个\t这个制表符的位置居然出现在了name[2]的位置
			//i =  0 name[ 0 ] =  ' '
			//i =  2 name[ 2 ] =  '		'	//这个是\t
			//i =  3 name[ 3 ] =  ' '		//如果按照上面的逻辑,那么\t后面的那个空格也是name[2]这个下标才对啊,
											//但是for循环已经进行了++,它已经跳过了\t后面第一个空格,这个时候读取到了\t后面的第二个空格,
											//为了纠正这个bug对它进行了i--
			//i =  6 name[ 6 ] =  ' '
        }
    }
	//不加i++的结果为:					//"Li Hua"
    qDebug() << name;					//"LiHua"

可以自己调试一下感受一下他们之间的关系哦。

六、其他

1.转小写 toLower()

QString QString::toLower() const

将字符串全部转成小写形式

例子:

QString name = "Li Hua";

    qDebug() << name.toLower();		//li hua

2.转大写 toUpper()

QString QString::toUpper() const

转成大写形式

例子:

QString name = "Li Hua";

    qDebug() << name.toUpper();		//LI HUA

3.字符串是否为空 isEmpty()

bool QString::isEmpty() const

当字符串为空返回true,否则返回false。"" 空字符串也算true

例子:

qDebug() << QString().isEmpty();		//true
    qDebug() << QString("").isEmpty();		//true
    qDebug() << QString(" ").isEmpty();		//false
    qDebug() << QString("a").isEmpty();		//false

4.字符串是否为空 isNull()

bool QString::isNull() const

当字符串为空返回true,否则返回false。

例子:

qDebug() << QString().isNull();			//true
    qDebug() << QString("").isNull();		//false
    qDebug() << QString(" ").isNull();		//false
    qDebug() << QString("a").isNull();		//false

5.填充字符(填满):

QString & QString::fill(QChar ch, int size = -1)

将字符串中的每个字符设置为字符ch。如果size不为-1(默认值),则预先将字符串调整为size大小,再进行填充。

例子:

QString name = "LiHua";
	//设置填充字符W,并填充
    name.fill('W');
    qDebug() << name;	//LiHua-->WWWWW
    name.fill('s',2);
    qDebug() << name;	//WWWWW-->ss

6.是否包含该字符串(有多个重载)

bool QString::contains(const QString & str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const

如果此字符串包含字符串str,则返回true;否则返回false。
如果cs是Qt::CaseSensitive(默认),则搜索是大小写敏感的;

例子:

QString name = "LiHua";
	
	bool isok;
	isok = name.contains("ua");	//true
	//Qt::CaseInsensitive 不区分大小写
	isok = name.contains("hUa",Qt::CaseInsensitive);	//true

7.是否以该字符串结尾(有多个重载)

bool QString::endsWith(const QString & s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const

如果字符串以s结尾,则返回true;否则返回false。
如果cs是Qt::CaseSensitive(默认),则搜索是大小写敏感的;

例子:

QString name = "LiHua";

    bool isok; 
    isok = name.endsWith("Hua");	//true
	//Qt::CaseInsensitive 不区分大小写
	isok = name.endsWith("hua",Qt::CaseInsensitive);	//true

8.是否以该字符串开头(有多个重载)

bool QString::startsWith(const QString & s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const

如果字符串以s开头,则返回true;否则返回false。
如果cs是Qt::CaseSensitive(默认),则搜索是大小写敏感的;

QString name = "LiHua";

    bool isok; 
    isok = name.startsWith("li");	//false
	//Qt::CaseInsensitive 不区分大小写
	isok = name.endsWith("li",Qt::CaseInsensitive);	//true

如果遇到其他好用的函数也会加进来的呀,里面有一个不属于QString的函数。

9.QFontMetrics类:字体度量信息

QFontMetrics类:QFontMetrics类提供字体度量信息,字符串的物理宽度(显示宽度)等信息。

9.1构造函数:列举一个

QFontMetrics(const QFont &font)

为一个字体构造度量

9.2 获取字符串绘制矩形

QRect boundingRect(QChar ch) const

返回一个矩形,获取字符串绘制矩形