文章目录
- 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
- 第一个参数是分隔符(以什么分割),第二个参数默认支持结果出现空条目(空格不算空条目),第三个参数是匹配大小写敏感,默认大小写敏感。
- 注意:当分隔符没有与之相匹配的时候,会将字符串作为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
返回一个矩形,获取字符串绘制矩形