1. QString概述
开发中,字符串是必不可少的。C++ 中提供两种字符串:传统的 C 语言型以 “\0” 结尾的字符数组和 std::string 类。而在 Qt 开发中,我们更多的是使用Qt专有的 QString 类,相似于 C++ 中的 std::string类,但是又有不同,因为 QString 支持 16位的 Unicode值。开发中使用 QString 时,不用刻意去担心 如何分配足够的内存空间 或是 确保数据以 “\0” 结尾的问题。这些 QString 都默默为我们搞定了,而且可以嵌入 “\0”字符。length() 函数会返回包括被嵌入的 “\0” 字符的整个字符串的大小。
2. QString 中常用的成员函数
(1) QString 操作符 + 和 += (连接两个字符串 和 追加字符串)
注意: 需 #include 头文件 QString
QString str1 = "Password:";
QString userPassword = "HIKVISION";
str1 += userPassword;
qDebug()<<"str1: "<<str1;
打印结果: str1: "Password:HIKVISION"
(2) QString::append() 字符串追加函数
append 函数和 += 操作符功能相同
QString str2 = "User:";
QString userName = "lixiaogang5";
str2.append(userName);
qDebug()<<str2;
打印结果:"User:lixiaogang5"
(3) QString::sprintf() 字符串连接函数
备注:QString::sprintf()函数支持与C/C++库中的sprintf 函数相同的格式说明符。
QString str3 =NULL;
str3.sprintf("%s %s","Password:","HIKVISION");
qDebug()<<str3;
打印结果:"Password: HIKVISION"
(4) QString::arg() 函数
该函数用来从其他 字符串或 数组 来建立一个字符串。
QString str4 = nullptr;
str4 = QString("%1 %2 %3 %4 (%5s-%6s)").arg("Time").arg("accuracy") \
.arg("range").arg("in").arg(1375).arg(1395);
qDebug()<<str4;
打印结果:
"Time accuracy range in (1375s-1395s)"
(5) QString::number() 函数 将数字
转换为字符串
函数原型为:
QString QString::number(double n, char format = 'g', int precision = 6) [static]
功能: 根据指定格式 format 和 精度 precision 返回 n 的字符串形式。其中format可取值如下:
Format Meaning
e format as [-]9.9e[+|-]999
E format as [-]9.9E[+|-]999
f format as [-]9.9
g use e or f format, whichever is the most concise
G use E or f format, whichever is the most concise
QString str5 = nullptr;
str5 = QString::number(100.011,'g',6);
qDebug()<<"str5:"<<str5;
打印结果:str5: "100.011"
注意: QString::setNum() 也能实现 number 的效果
QString str5 = nullptr;
str5.setNum(100.011,'g',6);
qDebug()<<str5;
打印结果: "100.011"
(6) QString::toInt() 、toLongLong()、toDouble() 等函数 将 字符串
转换为 数字
注意:这些函数接收一个任选的bool 变量的指针,并且根据 转换成功与否 来将 变量值 设为 true 或false。若转换成功,设为true(1),反之为false(0);
int hex = 0;
QString str6 = "10086";
bool flagOkorFalse;
hex = str6.toInt(&flagOkorFalse,16);
if( true == flagOkorFalse)
{
qDebug()<<"Conversion success";
}
else
{
qDebug()<<"Conversion failured.";
}
qDebug()<<hex;
打印结果:
Conversion success
65670
(7) QString::min() 从字符串中根据提取出 对应部分 字符串
QString str6 = "See farther, go farther";
qDebug()<<str6.mid(13,2);
打印结果: "go"
min 函数的原型如下:
QString QString::mid(int position, int n = -1) const
//常量成员函数
min函数有2个参数,第二个参数默认为-1;若第二个参数采用默认,则 min()函数返回在 给定位置开始到字符串末端结束的字串。
QString str6 = "See farther, go farther";
qDebug()<<str6.mid(13);
打印结果: "go farther"
(8) QString::left()、QString::right() 返回字符串的左边n个字符串、右边n个字符串
QString str7 = "See farther, go farther";
qDebug()<<str7.left(12)<<" "<<str7.right(10);
//其中参数12、10表示返回的字符个数,而不是下标
打印结果: "See farther," "go farther"
(8) QString::indexOf() 查明一个字符串是否包含一个特定的字符、字串或正则表达式
QString str7 = "See farther, go farther";
int index = str7.indexOf("farther");
if(-1 == index)
qDebug()<<"To find the failure";
else qDebug()<<index;
打印结果:4
成功则返回对应字符串的起始位置下标;失败则返回 -1.
(9) QString::startsWith() 和 QString::endsWith() 检查字符串是否以某个字符(串)开始或结束
QString str7 = "See farther, go farther";
if(str7.startsWith("See") && str7.endsWith("farther"))
{
qDebug()<<"TO DO...";
}else{
qDebug()<<"Not";
}
打印结果:TO DO...
注: 利用 left 和 right 也能实现同样的效果,但是使用 startsWith 和 endsWith 更加简单和快捷。
QString str7 = "See farther, go farther";
if(str7.left(3) == "See" && str7.right(7) == "farther")
{
qDebug()<<"TO DO...";
}else{
qDebug()<<"Not";
}
打印结果:TO DO...
(10) == (比较操作符)和 toUpper()、toLower()
== 操作符比较字符串时是区分大小的。如下:
QString str8 = "user:";
QString str9 = "User:";
if(str8 > str9)
qDebug()<<"greator";
else
qDebug()<<"less";
打印结果: greator //因为u的ASCII码 > U的ASCII码
若想比较两个字符串的大小,而且比较并不关系大小写,toLower 和 toUpper 是一个不错的选择。
QString str8 = "user:";
QString str9 = "User:";
if(str8.toUpper() == str9.toUpper())
qDebug()<<"equal";
else
qDebug()<<"not equal";
打印结果:equal
(11) QString::replace() 使用一个字符串来代替另一个字符串中的一部分
QString str10 = "Happy day";
qDebug()<<str10.replace(1,4,"APPY");
打印结果:"HAPPY day"
可以使用 remove 和 insert 组合来达到 replace 的效果。
QString str10 = "Happy day";
str10.remove(1,4);
str10.insert(1,"APPY");
qDebug()<<str10;
打印结果: "HAPPY day"
(12) QString::trimmed() 删除字符串两端的空白处 的空格(包括 空格符、制表符、换行符等)
QString str11 = " Just \n do \nit. \n";
//**Just*\n*do**\nit.*\n (*号代表空格)
/*======= trimmed之后 ===============*/
//Just*\n*do**\nit.
qDebug()<<str11.trimmed();
打印结果:
"Just
do
it."
(13) QString::simplified() 用简单的空格符代替字符串内部每一连续空白处的空格
QString str11 = "Just \n do \nit.";
qDebug()<<str11.trimmed();
打印结果:
"Just
do
it."
(14) QString::split() 把字符串分解成一些QStringList字串
例1:
QString str12 = "Hangzhou welcomes you";
QStringList stringList = str12.split(" ");
QStringList::const_iterator conIt = stringList.constBegin();
for (; conIt != stringList.constEnd(); ++conIt)
qDebug() << (*conIt).toLocal8Bit().constData() ;
打印结果:
Hangzhou
welcomes
you
把str12 以空格的形式分成了 Hangzhou welcomes you 3个子串。
QString str12 = "Hangzhou,Shanghai,GuiYang";
QStringList stringList = str12.split(",");
QStringList::const_iterator conIt = stringList.constBegin();
for (; conIt != stringList.constEnd(); ++conIt)
qDebug() << (*conIt).toLocal8Bit().constData() ;
打印结果:
Hangzhou
Shanghai
GuiYang
把str12 以逗号的形式分成了 Hangzhou Shanghai GuiYang3个子串。
(15) QString::empty() 和 QString::length() 判断字符串是否为空 和 返回字符串长度
QString str12 = "Hangzhou,Shanghai,GuiYang";
if(true == str12.isEmpty() || 0 == str12.length())
qDebug()<<"EMPTY";
else
qDebug()<<str12.length();
打印结果:25
(16) QString::join() 将QStringList中的项连接起来形成一个单一的字符串。
QString str12 = "Hangzhou,Shanghai,GuiYang";
QStringList stringList = str12.split(",");
stringList.sort(); //按字母表顺序排序
QString tmpStr = stringList.join(" ");
qDebug()<<tmpStr;
打印结果:"GuiYang Hangzhou Shanghai"
(17) QString::toAscii() 和 QString::toLatin1() 显示的将QString转换为 const char *类型字符串
QString str12 = "Hangzhou,Shanghai,GuiYang";
printf("str12[%s]\n",str12.toLatin1().data());
打印结果:str12[Hangzhou,Shanghai,GuiYang]
(17) QString::fromLocal8bit() 和 QString::fromUtf8() 、 QString::fromUtf16() 显示的将const char *转换为 QString字符串
const char *ch = "hello";
QString tempStr = QString::fromUtf8(ch);
qDebug()<<tempStr;
打印结果:"hello"