一、QT常用容器之QString

1、QString简介

QString是QT中的通用字符串类型,跨平台,易使用,API封装较为齐全,对于大多数的日常开发都能满足,相较于标准C++中的String更易于使用,开发速度更快,从其本质理解的话是一种字符容器,下面我们来介绍一些常用高频的使用方法,对于QString的构造初始化就不赘述,相信大家都会,我下面就以用法开始讲解。

2、类型传唤

2.1 QString & setNum(int n, int base = 10)

功能说明:将一个10进制数转换为QString类型,可以是float、double、int、long,如果是浮点数则有3个参数,可以指定小数点后位数,经测试无论调用时QString是否为空,均会清空之前的内容

参数:第一个参数传入需要转换的数字,第二个参数是转换之后的目标字符串进制基数,默认是10进制,可以显示的指定为你想要的任何进制,但是99%都是16进制不是吗,偶尔是2进制或者8进制

返回值:返回调用这个API的对象的引用,简单来说就是返回一个全新的QString

例:

void Test_setNum()
{
    QString strTest;
    //to Hex string
    short numHex = 127;
    strTest.setNum(numHex, 16);
    qDebug()<<"Hex: "<<strTest; // Hex:  "7f"

    //to Oct string
    int numOct = 63;
    strTest.setNum(numOct, 8);
    qDebug()<<"Oct: "<<strTest;// Oct:  "77"

    //to normal Dec string
    long numDec = 800;
    strTest.setNum(numDec);
    qDebug()<<"Normal: "<<strTest; // Normal:  "800"

    //to float string
    float numFixed = 123.78999;
    strTest.setNum(numFixed, 'f', 3);
    qDebug()<<"Fixed: "<<strTest; // Fixed:  "123.790"

    //to scientific double string
    double numScientific = 456.78999;
    strTest.setNum(numScientific, 'e', 6);
    qDebug()<<"Scientific: "<<strTest; // Scientific:  "4.567900e+2"
}
2.2 int QString::toInt(bool * ok = 0, int base = 10) const

功能说明:可以将一个字符串转换为整型数字,,也有toDouble等函数,用法基本相同,此处以toInt为例

参数:缺省参数ok:传入参数用于表示转换是否成功,base:指定待转换的字符串进制,默认十进制

返回值:转换后的数字

例:

void Test_toValue()
{
    bool bok = false;
    //dec
    QString strDec = QObject::tr("800");
    int nDec = strDec.toInt(&bok, 10);
    qDebug()<<nDec<<"\t"<<bok;       // 800		true
    //Hex
    QString strHex = QObject::tr("FFFF");
    nDec = strHex.toInt(&bok, 10);  //基数错误,转换失败
    qDebug()<<nDec<<"\t"<<bok; // 0		flase

    short nHexShort = strHex.toShort(&bok, 16);
    qDebug()<<nHexShort<<"\t"<<bok; //FFFF正整数太大,超出范围,转换失败,没有负号 - 的都算正数。

    ushort nHexUShort = strHex.toUShort(&bok, 16);
    qDebug()<<nHexUShort<<"\t"<<bok;// 65535		true

    //自动转换
    QString strOct = QObject::tr("0077");
    int nOct = strOct.toInt(&bok, 0);
    qDebug()<<nOct<<"\t"<<bok;  //字符 0 打头自动按八进制转 63		true

    QString strHexWithPre = QObject::tr("0xFFFF");
    int nHexWithPre = strHexWithPre.toInt(&bok, 0);
    qDebug()<<nHexWithPre<<"\t"<<bok;   //字符 0x 打头自动按十六进制转 65535		true

    int nDecAuto = strDec.toInt(&bok, 0);   //"800" ,自动按十进制
    qDebug()<<nDecAuto<<"\t"<<bok;// 800		true	

    //浮点数转换
    QString strFixed = QObject::tr("123.78999");
    double dblFixed = strFixed.toDouble(&bok);
    qDebug()<<fixed<<dblFixed<<"\t"<<bok;// 123.789990		true
    //科学计数法
    QString strScientific = QObject::tr("1.238e-5");
    double dblScientific = strScientific.toDouble(&bok);
    qDebug()<<scientific<<dblScientific<<"\t"<<bok; // 1.238000e-05 		true
}

3、查找与操作

在处理文本或者数据时,常常用到一些字符串查找拼接之类的,但是频率一般不高,因为比较琐碎且繁多,用法也较为简单,此处列出并作说明,用到的时候查询一下,千万不要试图背下来,属实没必要,做此说明,就不做实例

QString &    append(const QString & str)
//append 追加子串到字符串尾部。
    
QString &    prepend(const QString & str)
//prepend 将子串加到字符串头部。
    
bool    startsWith(const QString & s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
//startsWith 判断字符串(如 "abcd")是否以某个子串(如 s 是 "ab")打头,cs 指判断时大小写是否敏感 ,返回 bool。
    
bool    endsWith(const QString & s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
//endsWith 判断字符串(如 "abcd")是否以某个子串(如 s 是 "cd")结尾,cs 指判断时大小写是否敏感,返回 bool。
    
bool    contains(const QString & str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
//contains 判断字符串对象里是否包含子串 str ,参数 cs 指判断时大小写是否敏感,后面函数的 cs 都是一个意思,不重复说了。
    
int    count(const QString & str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
//count 对字符串对象里子串 str 出现的次数做统计,返回出现次数,如果没出现就返回 0。
    
int    indexOf(const QString & str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
//indexOf 从 from 指定的序号开始查询子串 str,返回查到的第一个 str 子串起始位置序号。查不到就返回 -1 。
    
QString &    insert(int position, const QString & str)
//insert 是将子串 str 插入到 position 序号位置,子串 str 插入后的起始序号就是 position 。
    
QString &    remove(int position, int n)
//remove 从 position 开始的位置移除掉 n 个字符,如果 n 比 position 位置开始的子串长度大,后面的就会被全部移除。
    
QString &    remove(const QString & str, Qt::CaseSensitivity cs = Qt::CaseSensitive)
//这个重载的 remove 函数将匹配的所有子串 str 都从字符串里面移除掉,拿来消除空格之类的字符比较好使。
    
QString &    replace(int position, int n, const QString & after)
//replace 将从 position 序号开始的 n 个字符的子串替换成 after 字符串。
    
QString &    replace(const QString & before, const QString & after, Qt::CaseSensitivity cs = Qt::CaseSensitive)
//这个重载的 replace 将字符串里出现的所有子串 before 全部替换为新的 after。
    
QStringList    split(QChar sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
QStringList    split(const QString & sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
//split 用字符或子串 sep 切分当前字符串内容,然后将切分的所有子串以 QStringList 列表形式返回,可以从返回的列表提取各个子串。behavior 是分隔模式,是否保留空白字符区域等。
    
QString    section(QChar sep, int start, int end = -1, SectionFlags flags = SectionDefault) const
QString    section(const QString & sep, int start, int end = -1, SectionFlags flags = SectionDefault) const
//section 函数首先将字符串按照字符或子串 sep 分成段落,类似 split 划分,但 section 只返回第 start 段到第 end 段之间的内容。如果没指定 end 就一直包含到最后。flags 参数影响划分行为,如大小写敏感、是否忽略空白区域等。
    
QString    left(int n) const
//left 返回字符串左边 n 个字符构成的子串。
    
QString    right(int n) const
//right 返回字符串右边 n 个字符构成的子串。 
    
QString    mid(int position, int n = -1) const
//mid 返回从 position 位置开始的 n 个字符构成的子串。不设置 n 的话就包含到末尾。
    
QString &    fill(QChar ch, int size = -1)
 //fill 用字符 ch 填充当前字符串,如果不指定 size ,就把所有的字符都填成 ch 字符。如果指定正数 size,字符串长度被重置为 size 大小,里面依然全是 ch 字符。
    
QString    repeated(int times) const
//将当前字符串重复拼接 times 次数,返回新的重复串。
    
QString    trimmed() const
//trimmed 剔除字符串头部和尾部的空白字符,包括 '\t', '\n', '\v', '\f', '\r', ' '  。 字符串中间的空白不处理。
    
QString    simplified() const
//simplified 剔除字符串里出现的所有空白字符,包括 '\t', '\n', '\v', '\f', '\r', ' '  。 两端和中间的都剔除。
    
void    truncate(int position)
//truncate 是从 position 序号开始截断字符串,只保留 0 ~ position-1 位置的字符串,position 位置被设为 NULL,后面的全移除。

4、arg函数

原型

  • QString arg(int a, int fieldWidth = 0, int base = 10, QChar fillChar = QLatin1Char( ' ' )) const

  • QString arg(double a, int fieldWidth = 0, char format = 'g', int precision = -1, QChar fillChar = QLatin1Char( ' ' )) const

功能说明:arg 函数也是构造字符串的函数,但是比 setNum 函数功能更强大,arg可以设置目标字符串宽度和填充字符。arg 函数还可以用字符串作为参数,可以将一个字符串填充到另一个里面,使用占位符进行拼接、参数填充等等。

注意 arg 函数声明末尾的 const,这个函数不会改变字符串对象本身的内容,而是会返回一个全新的 QString 对象,所以使用这个函数时,必须用它的返回值。
对于整数类型,它的声明多出来两个:fieldWidth 是指生成的目标字符串宽度,0 表示自动设置长度,最后的 fillChar 是填充字符,如果设置的域宽比较大,多余的空位就会使用这个填充字符填满。
对于浮点数类型,多出来的 fieldWidth 也是生成的目标字符串宽度,fillChar 也是填充字符。默认的填充字符是空格,QLatin1Char 代表一个字节长度的拉丁字符,与 ASCII 码字符差不多。QLatin1Char 有对应的类 QLatin1String,因为仅支持单字节拉丁字符,不支持国际化,它应用的比较少。
arg 函数比 setNum 函数功能更强大,可以设置目标字符串宽度和填充字符。arg 函数还可以用字符串作为参数,可以将一个字符串填充到另一个里面,比如下面这个函数声明:

QString arg(const QString & a, int fieldWidth = 0, QChar fillChar = QLatin1Char( ' ' )) const

这个声明和数值类型声明差不多,也可以设置目标字符串宽度和填充字符。
函数声明介绍到这,下面看看这个函数该怎么用。arg 函数的使用方式很特别,它的串联方式也很灵活,来看看示例代码:

void Test_arg()
{
    //使用 strResult 存储 arg 返回的新对象
    QString strResult;

    //Dec
    long numDec = 800;
    QString strMod = QObject::tr("Normal: %1");
    strResult = strMod.arg(numDec);  //%1是占位符,第一个arg函数参数变量转后的字符串填充到 %1 位置
    qDebug()<<"Mod: "<<strMod<<" \t Result: "<<strResult;

    //Oct
    int numOct = 63;
    strResult = QObject::tr("Oct: %1").arg(numOct, 4, 8, QChar('0'));  //numOct转换后为4字符域宽,8进制,填充0
    qDebug()<<strResult;

    //Hex
    short numHex = 127;
    QString strPrefix = QObject::tr("0x");
    //占位符里可填充数值转的字符串,也可以直接填充原有的字符串
    strResult = QObject::tr("Hex: %1%2").arg(strPrefix).arg(numHex, 0, 16);  //串联:第一个arg函数参数填充到%1,第二个arg填充到%2
    qDebug()<<strResult;

    //double
    double numReal = 123.78999;
    strResult = QObject::tr("Fixed: %1 \t Scientific: %2").arg(numReal, 0, 'f').arg(numReal, 0, 'e', 3);
    qDebug()<<strResult;

    //占位符可重复,也可乱序
    int one = 1;
    int two = 2;
    int three = 3;
    strResult = QObject::tr("%1 小于 %2,%1 小于 %3,%3 大于 %2 。").arg(one).arg(two).arg(three);
    qDebug()<<strResult;
}

上面都是通过 tr 函数封装了一个临时的 QString 对象,然后调用该临时对象的 arg 函数实现数值类型转成格式化字符串,填充到占位符里面。这个工作原理与 sprintf 等 C 语言函数类似,sprintf 函数使用 %n 、%s 之类的格式占位符,QString 的实现方式不一样,它使用 % 加数字的占位方式,%1 对应后面串联的第一个 arg 函数,%2 对应后面串联的第二个 arg 函数,以此类推。具体的 %1 或 %2 等替换后的格式,由对应的 arg 函数来决定,QString 里有非常多的重载 arg 函数,每个 arg 函数对应一个类型,因此 %1 既可以填充数值类型转化后的格式化字符串,也可以填充其他原有的字符串。下面逐个解释一下各个 arg 函数意义:

 long numDec = 800;
    QString strMod = QObject::tr("Normal: %1");
    strResult = strMod.arg(numDec);  //%1是占位符,第一个arg函数参数变量转后的字符串填充到 %1 位置
    qDebug()<<"Mod: "<<strMod<<" \t Result: "<<strResult;

这是最简单的形式,tr函数生成的 strMod 对象里面只有一个占位符 %1 ,arg 函数会将整数 numDec 转成十进制数字符串,然后根据 strMod 构造一个新的字符串对象,并将十进制数字符串填充到占位符 %1 位置。原本的 strMod 不会改变,arg 函数会返回全新的字符串对象,然后复制给了 strResult。qDebug 打印的结果就是:
Mod: “Normal: %1” Result: “Normal: 800”

int numOct = 63;

    strResult = QObject::tr("Oct: %1").arg(numOct, 4, 8, QChar('0'));  //numOct转换后为4字符域宽,8进制,填充0
    qDebug()<<strResult;

这里 arg 函数是将普通数字 63 用八进制数来显示,要转换的数值是 numOct,设置 numOct 转换后的子串至少 4 字符宽度,用八进制显示,空位用字符 ‘0’ 填充。qDebug 打印的结果就是:
“Oct: 0077”

short numHex = 127;

    QString strPrefix = QObject::tr("0x");
    //占位符里可填充数值转的字符串,也可以直接填充原有的字符串
    strResult = QObject::tr("Hex: %1%2").arg(strPrefix).arg(numHex, 0, 16);  //串联:第一个arg函数参数填充到%1,第二个arg填充到%2
    qDebug()<<strResult;

这里使用了串联的两个 arg 函数,第一个 arg 函数是填充原有字符串 strPrefix 到 %1 位置,第二个 arg 函数填充 numHex 转换后的十六进制字符串到 %2 位置。第二个 arg 函数参数里的 0 是指不限制域宽,转换后的十六进制字符串该多长就多长,参数 16 是十六进制的意思。占位符本身是没有格式信息的,填充的具体内容由后面串联的 arg 函数决定,想填充原有字符串就填充原有的字符串,想填充转换后的数字字符串,那就填充数字字符串,非常方便。qDebug 打印的结果为:
“Hex: 0x7f”

double numReal = 123.78999;

    strResult = QObject::tr("Fixed: %1 \t Scientific: %2").arg(numReal, 0, 'f').arg(numReal, 0, 'e', 3);
    qDebug()<<strResult;

这里展示的是浮点数转成字符串,第一个 arg 函数将 numReal 以定点数形式(‘f’)转成字符串,0 代表不限制宽度,并填充到 %1 位置,没有设 置显示精度(默认为 6 位)。第二个 arg 函数将 numReal 以科学计数法形式(‘e’)转成字符串,0 代表不限制宽度,3 代表显示精度为 3 位。qDebug 打印的结果为:
“Fixed: 123.789990 Scientific: 1.238e+02”

int one = 1;

    int two = 2;
    int three = 3;
    strResult = QObject::tr("%1 小于 %2,%1 小于 %3,%3 大于 %2 。").arg(one).arg(two).arg(three);
    qDebug()<<strResult;

最后一段示例比较有意思,如果是 C 语言的 sprintf 要填充 6 个整型数,那必须用 6 个 %n ,不管有没有重复的。这里仅仅用了 %1、%2、%3,后面对应三个 arg 函数,每个 arg 函数都将参数里的变量转成数字字符串,并填充到正确的位置,而且可以重复填充。占位符的顺序也可以是乱的,规律就是第一个 arg 函数填充所有的 %1 ,第二个 arg 函数填充所有的 %2 ,第三个 arg 函数填充所有的 %3 ,以此类推。因此 qDebug 打印的结果就是:
“1 小于 2,1 小于 3,3 大于 2 。”

这正是我们希望看到的结果,可见 arg 函数的灵活性是传统 C 语言 sprintf 等无法比拟的,而且也更安全。学会 arg 函数用法,可应对各种复杂的格式化字符串转换。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值