💢💢目录总览💢💢: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 == 0
2、字符串是否包含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 false
4、字符串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();//无符号int
toInt、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 == false
QString转数字精度缺失问题
在下面的例子中,变量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.90
2、数字转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=2
2、搜索字符串出现的位置
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);//3
3、计算字符串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 wor
3、清空字符串
//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 world
11、字符串去除空格
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"