
💢💢目录总览💢💢:QT基础入门目录总览
QString支持的操作符号有:
用于字符串之间比较:"!=" "<" "<=" "==" ">="
用于字符串之间传递:"+=" "="
一、字符串判断
1、字符串比较Qt QString::compare
第三(二)个参数
CaseInsensitive:不区分大小写 CaseSensitive:区分大小写 不写参数则默认区分大小写返回值
0:字符串相同 !0: 字符串不同
    //用法1
    QString::compare("ab","ab");    //值为0;
    QString::compare("ab","df");  //值为<0;
    QString::compare("df","ab");    //值为>0;
    int test = QString::compare("aUtO", "AuTo", Qt::CaseInsensitive);  // test == 0
    int test = QString::compare("aUtO", "AuTo", Qt::CaseSensitive);    // test > 0
    //用法2(简便)
    int test=QString("data").compare("data");// test == 02、字符串是否包含Qt QString::contains
第二个参数
CaseInsensitive:不区分大小写,默认区分大小写
返回值
包含:true 不包含:false
    QString str1 = "Peter Pan";
    QString str2 = "peter";
    bool test;
    test=str1.contains(str2, Qt::CaseInsensitive);  
    //test为true:包含  test为false:不包含3、判断字符串str是否为空,是否没有字符
只要讲到字符串,那就少不了判空操作,QT是isNull() 和 isEmpty()。
 如果一个空字符串,只有“\0”,isNull() 返回 false,而 isEmpty() 返回 true;只有未赋值的字符串,isNull() 才返回 true。
    //字符串没有字符
    QString().isEmpty();            // returns true
    QString("").isEmpty();          // returns true
    QString("x").isEmpty();         // returns false
    QString("abc").isEmpty();       // returns false
    
    //字符串为空
    QString().isNull();             // returns true
    QString("").isNull();           // returns false
    QString("abc").isNull();        // returns false4、字符串str1是否以str2结尾
    QString str = "Bananas";
    str.endsWith("anas");         // returns true
    str.endsWith("pple");         // returns false
            5、判断字符串str是否以字符串str2开头
第二个参数:
CaseInsensitive:不区分大小写,默认区分大小写
返回值:
开头:true 不开头:false
    QString str = "Bananas";
    str.startsWith("Ban",Qt::CaseSensitive);         // returns true
    str.startsWith("ban",Qt::CaseInsensitive);       // returns true
    str.startsWith("Car",Qt::CaseSensitive);         // returns false二、字符串转换
1、QString转数字
    QString string = "1";
    int int_string = string.toInt();//int类型
    long long_string = string.toLong();//long
    float float_string = string.toFloat();//float
    short short_string = string.toShort();//short
    double double_string = string.toDouble();//double
    qlonglong longlong_string = string.toLongLong();//long long int, 即__int64 64位有符号int
    unsigned int unint_string = string.toUInt();//无符号inttoInt、toLong、toShort、toLongLong、toUInt要求的都是整型,也就是变量需要是0-9之间,有其他字符都会导致转换失败。1.01会转换成0。可以做以下处理。
    QString string = "1.01";
    bool ok;
    int int_string = string.toInt(&ok);//int类型
    if(!ok)
    {
        printf("数据转换失败,原始类型非整型");
    }    //example 1      QString >> double
    bool d;
    d = QString( "1234,56" ).toDouble(&ok); // ok == false
    d = QString( "1234.56" ).toDouble(&ok); // ok == true, d == 1234.56
    //exapmle 2      QString >> folat
    QString str1 = "1234.56";
    str1.toFloat();             // returns 1234.56
    bool ok;
    QString str2 = "R2D2";
    str2.toFloat(&ok);          // returns 0.0, sets ok to false
    //exapmle 3     QString >> int 
    QString str = "FF";
    bool ok;
    //16表示十六进制
    int hex = str.toInt(&ok, 16);       // hex == 255, ok == true
    //10表示十进制 转换失败
    int dec = str.toInt(&ok, 10);       // dec == 0, ok == falseQString转数字精度缺失问题
在下面的例子中,变量a减去一个常量,本该值为0.90,但是通过程序得到a的值0.8999999999,例子如下:
float a = 0.95;
a = a - 0.05;解决:
QString Astring=(QString::number(a, 'f', 2));//"0.90"
float Afloat=a.toFloat();//0.902、数字转QString(字符串,16进制、8进制、2进制)
 1.使用QString::number函数
 
原型:QString::number(long n,base=10);
第一个参数是要转行的数据,第二个参数是进制     //int to String
     int target=10;
     十进制方式转QString
     QString test1=QString::number(target, 10);//"10"
     16进制方式转QString
     QString test2=QString::number(target, 16);//"a"
     Qt 转变数字为字符串,16进制、8进制、2进制
     QString::number(10, 16).toStdString();
     QString::number(10, 8).toStdString();
     QString::number(10, 2).toStdString();
     //float to String
     float target=10.99;
     //2表示保留两位小数
     QString test=QString::number(target, 'f', 2);//10.99
     //'g'代表精度  3表示显示三位有效数字
     QString::number(12.34,'g',3);       //"12.3"
     
     
2.使用QString::setNum函数
    QString str;
    
    //10代表以10进制转换成字符串(允许范围2~36)
    str.setNum(1234,10);       // str == "1234"
    //'g'代表精度  3表示显示三位有效数字
    str.setNum(12.34,'g',3);       // str == "12.3"3.使用带参数的QString
  //int to String
  int target=10;
  QString Str=QString("%1").arg(target);
  qDebug()<<Str;
  output:"10"
  //float tostring
  float target=10.99;
  QString Str=QString("%1").arg(target);
  qDebug()<<Str;
  output:"10.99"4.使用sprintf格式化转化为字符串
    qDebug()<<QString::asprintf("%.1f",total);//str=42.8
    qDebug()<<str.sprintf("%.2f",total);//str=42.81
    QString str;
    int value=1998;
    str.sprintf("value=%d",value);
    qDebug() <<str; //str="value=1998"3、将字符串str中所有的字母转化为小写字母或大写字母
    //example 1   大写转小写
    QString str = "The Qt PROJECT";
    str = str.toLower();        // str == "the qt project"
    //example 2   小写转大写
    QString str = "TeXt";
    str = str.toUpper();        // str == "TEXT"三、QStringl与其他类的类型转换
1、QString与QByteArray之间互相转换
Qt的QByteArray类提供了很方便的对字节流操作的接口,主要应用场合是二进制等;
QByteArray只是单纯用来处理数据的,除了能处理ASCII编码字符,其它复杂的编码不能处理,直接以字节流的方式来对待。
QString是专门用来处理字符串的,除了能处理ASCII编码字符,还包括各国语言的编码,默认情况下QString会把所有数据当做utf-8编码来处理。
1.1 QString转QByteArray
 QString str("123abc这是测试");
 QByteArray byte1 = str.toLatin1(); //按照ASCII编码转换,无法转换中文
 QByteArray byte2 = str.toUtf8();    //按照Utf-8编码转换,可以转换中文
 qDebug() <<  "byte1:" << byte1 << "byte2:" << byte2;输出结果:byte1: "123abc????" byte2: "123abc\xE5\xB0\x8F\xE9\xA9\xAC\xE5\x93\xA5"
1.2 QByteArray转QString
QByteArray byte("123abc这是测试");
QString str(byte);
qDebug() <<  "byte:" << byte << "str:" << str;输出结果:byte: "123abc\xE5\xB0\x8F\xE9\xA9\xAC\xE5\x93\xA5" str: "123abc这是测试"
2、QString与char类型的转换
 2.1 QString 转换为 char *
 
将 QString 转 char *,需要用到 QByteArray 类,因为 char * 最后都有一个’\0’作为结束符,而采用 QString::toLatin1() 时会在字符串后面加上’\0’
QString  str;
char*  ch;
QByteArray ba = str.toLatin1(); // must
ch=ba.data();注意第3行,一定要加上,不可以 str.toLatin1().data() 这样一步完成,否则可能会出错。
补充:以上方法当 QString 里不含中文时,没有问题,但是 QString 内含有中文时,转换为 char * 就是乱码,采用如下方法解决:
方法1:
添加GBK编码支持:
#include <QTextCodec>
QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));然后将上面的第3行修改为:
QByteArray ba = str.toLocal8Bit(); // toLocal8Bit 支持中文方法2:
先将 QString 转为标准库中的 string 类型,然后将 string 转为 char *。如下:
QString  filename;
std::string str = filename.toStdString();
const char* ch = str.c_str();2.2 char * 转换为 QString
将 char * 转换为 QString 比较容易操作,我们可以使用 QString 的构造函数进行转换:
QString(const QLatin1String &str);
QLatin1String 的构造函数:
QLatin1String(const char *str);
因此用下面这个语句就可以将 char * ch 转换为 QString str 了,如下:
char * ch;
str = QString(QLatin1String(ch));3、QString 与 char []互转
3.1 QString 转换为 char []
char* ptr;
QByteArray ba;
ba = str.toLatin1();
ptr = ba.data();
char name[10];
memcpy(name,ptr,10); 3.2 char[] 转换为QString
最保险的方法
char ch_data[512];
QString str_data;
str_data = QString::fromLocal8Bit(ch_data,512);c++ 强制转换
char a[]="123";
QString str=a;其中:
a[0]='1' str[0]='1'
a[1]='2' str[1]='2'
a[2]='3' str[2]='3'
a[3]='\0'
str在赋值时,遇到'\0'停止。
4、QString和std::string的相互转换
 1.QString转std::string
 
std::string test_string = test2.toStdString();2.std::string转QString
    std::string string1 = "a";
    QString string1_QString = QString::fromStdString(string1);
  
四、字符串查询
1、字符串str2在字符串str1中出现过几次
    QString str1 = "HELLO world hello world";
    QString str2 = "hello";
    int rel;
    rel=str1.count(str2, Qt::CaseInsensitive); //搜索不区分大小写
    qDebug() <<rel; // rel=22、搜索字符串出现的位置
QT的字符串查找有两个函数indexOf () 和 lastIndexOf (),indexOf ()查询第一个出现的位置,lastIndexOf ()查询最后一个出现的位置。
    QString str1 = "sticky question"; //包含了2个 “sti”
    QString str2 = "sti";
    //从位置0开始搜索
    str1.indexOf(str2);               // returns 0  (第一次出现位置0))
    //从位置1开始搜索
    str1.indexOf(str2, 1);            // returns 10 (第一次出现位置10))
    //从位置10开始搜索
    str1.indexOf(str2, 10);           // returns 10 (第一次出现位置10)
    //从位置11开始搜索
    str1.indexOf(str2, 11);           // returns -1 (不存在)
    test2 = "hello QT";
    int place = test2.indexOf("l"); //2
    int place1 = test2.lastIndexOf("l");//3
 在std::string中有更多的搜索函数   
  
 test= "hello QT";
//从左到右找l,返回的是第一个l的位置
test.toStdString().find("l");//2
//从右到左找l,返回的是最后一个l的位置
test.toStdString().find_last_of("l");//3
//从左到右找l,返回的是第一个l的位置
test.toStdString().find_first_of("l");//2
//从右到左找l,返回的是最后一个不是T的位置,即Q的位置
test.toStdString().find_last_not_of("T");//6
//从左到右找l,返回的是第一个不是h的位置,即e的位置
test.toStdString().find_first_not_of("h");//1
//从右到左找l,返回的是最后一个l的位置,逆序查找
test.toStdString().rfind("l");//3所以如果QString不涉及中文或者其他特殊字符,可以转换成std::string查找。
不过QString可以指定是否大小写敏感
int lastIndexOf(const QString &s, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
from参数:从哪里查找,如果忘记就麻烦了CaseSensitivity敏感性是一个枚举类:默认区分大小写
enum CaseSensitivity { CaseInsensitive,//不区分大小写 CaseSensitive//区分大小写 };
        QString test2 = "hello QT";
        test2.lastIndexOf("L",6,Qt::CaseInsensitive);//3
        test2.lastIndexOf("l",6);//-1
        test2.lastIndexOf("l",6);//33、计算字符串str长度
    QString str = "hello";
    int rel=str.length();
    qDebug() <<rel; // rel=5五、字符串截取分割拼接
1、取出字符串中指定位置的字符
    QString str="hello world";
    char ch;
    ch=str.at(1).unicode();
    qDebug() <<ch;  //ch=e
2、从字符串末尾删除若干个字符
    QString str="hello world";
    str.chop(2);
    qDebug() <<str; //str= hello wor3、清空字符串
    //example 1
    QString str="hello world";
    str.clear();
    qDebug() <<str.size(); //str=""
    //example 2
    QString str="hello world";
    str="";
    qDebug() <<str.size(); //str=""4、在字符串str1指定位置中插入str2
    QString str1 = "Meal";
    QString str2 = "ontr";
    str1.insert(1, str2); //从位置1开始插入
    // str1 == "Montreal"5、从字符串str1中指定位置截取字符
    QString str1 = "Nine pineapples";
    //从位置5开始截取,截取4个字符
    QString str2 = str1.mid(5, 4);      // str2 == "pine"
     //从位置5开始截取,截取到最后
    QString str3 = str1.mid(5);         // str2 == "pineapples"6、从字符串str中指定位置开始移除若干个字符
    QString str = "Montreal";
    //从位置1开始,移除4个字符
    str.remove(1, 4);// str == "Meal"7、从str1字符串中指定位置开始替换若干个字符
    QString str1 = "Say yes!";
    QString str2 = "no";
    //从位置4开始,替换3个字符
    str1.replace(4, 3, str2); // str1 == "Say no!"8、以指定字符对字符串进行分割,将分割后的某一段取出
    QString str;
    QString csv = "forename,middlename,surname,phone";
    QString path = "/usr/local/bin/myapp"; // 第一个字段是空的
    QString::SectionFlag flag = QString::SectionSkipEmpty;
    //以“,”为分隔符,将从左往右的第2段返回
    str = csv.section(',', 2, 2);   // str == "surname"
    qDebug() <<str;
    //以“/”为分隔符,将从左往右的第3段到第4段返回
    str = path.section('/', 3, 4);  // str == "bin/myapp"
    qDebug() <<str;
    //以“/”为分隔符,将从左往右的第3段(忽略前面的空字段)
    str = path.section('/', 3, 3, flag); // str == "myapp"
    qDebug() <<str;
    
    //前面符号表示从右往左计数
    str = csv.section(',', -3, -2);  // str == "middlename,surname"
    str = path.section('/', -1); // str == "myapp"
    //这里除了可以以单个字符','为分割符外,还可以以"**"字符串为分割符号,可自行实验
9、从指定位置截断字符串str
    QString str = "Vladivostok";
    str.truncate(4);    // str == "Vlad"10、字符串末尾追加
    //法 1
       QString str="hello";
       str.append("world");
       qDebug() <<str;    //str=hello world
    
    //法 example 2
       QString str="hello";
       str=str+"world";
       qDebug() <<str;     //str=hello world
    
    //法 example 3
       QString str="hello";
       str+="world";
       qDebug() <<str;     //str=hello world11、字符串去除空格
trimmed() 和 simplified()两个函数可以去除字符串的空格。而且实际去除空格也是用的比较多的,特别是如果你需要用户手写用户名啥的,最常见的就是用户的用户名前后加了空格。
trimmed() 去掉字符串首尾的空格,用的最多。
simplified() 不仅去掉首尾的空格,中间连续的空格用一个空格替换并且去掉字符串首尾的空格。
1.去掉字符串首尾的空格
QString test = " hello     QT              22 ";
qDebug() << "test_trimmed : "<< test.trimmed();
test_trimmed :  "hello     QT              22"
2.连续的空格用一个空格替换并且去掉字符串首尾的空格
QString test = " hello     QT              22 ";
qDebug() << "test_simplified : "<< test.simplified();
test_simplified :  "hello QT 22"3.删除所有空格
使用正则表达式:
QSring.remove(QRegExp("\\s"));
QString str = "   a c d a   ";//字符串aa前后各三个空格
str.remove(QRegExp("\\s"));// str="acda";4.去除字符串前面空格
使用正则表达式:
QSring.remove(QRegExp("^ +\\s*"));
QString str = "   aa   ";//字符串aa前后各三个空格
str.remove(QRegExp("^ +\\s*")); // str="aa   ";5. 去除字符串后面空格
使用正则表达式:
QSring.remove(QRegExp("\\s* +$"));
QString str = "   aa   ";//字符串aa前后各三个空格
str.remove(QRegExp("\\s* +$"));// str="   aa";
  
六、其他用法
1、QString::arg()用法
 QString str = QString("%1%2%3").arg(1).arg(2).arg("hello");%1, %2, %3作为占位符,将被后面的arg()函数中的内容依次替换,比如%1将被替换成1,%2将被替换成2,%3将被替换成"hello"。输出为:"12hello"



















