QT之QString 常用用法大总结

QString是Unicode字符的集合,它是Qt API中使用的字符串类。

QString的成员是QChar,QChar是一个16位Unicode字符类。大多数编译器把它看作是一个unsigned short。

 QString和C标准中的字符串不同,C++原生提供两种字符串: 传统的C风格以’\0’结尾的字符数组和std::string类。与这些不同,QString使用16-bit Unicode值。
当使用QString时,我们不必操心如此隐秘的细节,像分配足够的内存或者是数据是’\0’结尾的。 总的来说,QString可以被认为是一个QChar向量。一个QString能嵌入’\0’字符。 length()函数返回整个字符串大小,包括嵌入的’\0’。

0. 获取子字符串在字符串中的位置

indexOf() 返回此字符串中第一次出现的字符串str的索引位置,从索引位置向前搜索。 如果找不到str,则返回-1。

lastIndexOf()函数,返回字符串的最后一次出现的索引。

如果cs是Qt :: CaseSensitive(默认),则搜索区分大小写; 否则搜索不区分大小写。

区别:indexOf()方法从字符串的开头向后搜索字符串,而lastIndexOf()方法是从字符串的末尾向前搜索子字符串。

QString x = "sticky question";  

QString y = "sti";  

x.indexOf(y);               // returns 0  

x.indexOf(y, 1);            // returns 10  

x.indexOf(y, 10);           // returns 10  

x.indexOf(y, 11);           // returns -1

应用:  获取字符"."在字符串fileName中的位置

int index_point =0; //"."所现在位置

QString x = fileName;

QString y = ".";  

index_point = x.indexOf(y);    // returns  

1. 字符串的追加和组合

(1)二元操作符“+” 用来组合两个字符串,“+=”可以用于字符串的追加;例如:

QString str = "Hello";
str += "World!" //str = "Hello World!"

(2) QString::append()函数,具有与“+=”操作符同样的功能,实现字符串末尾追加另一个字符串,例如:

QString str1 = "Welcome ";
QString str2 = "to ";
str1.append(str2);             //str1 = "Welcome to "
str1.append("you !");         //str1 = "Welcome to you !" 

(3)组合字符串的另一个函数是QString::sprintf(),此函数支持的格式定义和C++库中的函数sprintf()定义一样,例如:

 QString str;
 str.sprintf("%s","Welcome ");     //str = "Welcome "
 str.sprintf("%s"," to you! ");      //str = " to you! "
 str.sprintf("%s %s","Welcome "," to you! ");     //str = "Welcome  to you! "; 

(4)Qt还提供了另一种方便的字符串组合方式,使用QString::arg()函数,此函数的重载可以处理很多的数据类型。此外,一些重载具有额外的参数对字段的宽度、数字基数或者浮点精度进行控制。相对于QString::sprintf(),QString::arg()是一个比较好的解决方案,因为它类型安全,完全支持Unicode,并且允许改变“/n”参数的顺序。例如:

QString str;
str = QString("%1,%2").arg("aa").arg("bb"); //str = "aa,bb"

 

2. 字符串相互转换

 (1) 数字转换为字符串

     使用静态函数QString::number():

str = QString::number(3.14);

    setNum(int n, int base = 10)函数,将字符串设置为指定的打印值,并返回对字符串的引用。
默认值为10,必须在2到36之间。对于10以外的值,n被视为无符号整数。

str.setNum(3.14);

 (2)字符串转换为数字

       常用的有toInt(), toLongLong(), toDouble(), toFloat()...等等

long	toLong ( bool * ok = 0, int base = 10 ) const
qlonglong	toLongLong ( bool * ok = 0, int base = 10 ) const
short	toShort ( bool * ok = 0, int base = 10 ) const
double	toDouble ( bool * ok = 0 ) const
float	toFloat ( bool * ok = 0 ) const
uint	toUInt ( bool * ok = 0, int base = 10 ) const
ulong	toULong ( bool * ok = 0, int base = 10 ) const
qulonglong	toULongLong ( bool * ok = 0, int base = 10 ) const
ushort	toUShort ( bool * ok = 0, int base = 10 ) const

参数ok结果说明转换是否成功。

QString std = "123";
float i = str.toFloat();
int j = str.toInt();

3. 字符串比较

  常用原型

int compare ( const QString & other ) const
int compare ( const QString & other, Qt::CaseSensitivity cs ) const
int compare ( const QLatin1String & other, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const
int compare ( const QStringRef & ref, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const

4. 提取字符串

  (1) 中间截取 mid(int position, int n = -1)函数用于返回一个字符串,如果目标字符串包含从指定的位置索引开始的n个字符,则返回指定位置开始的由n个字符组成的字符串;如果位置索引超过了字符串的长度,则返回空字符串;如果从给定位置开始的字符串中有少于n个字符,或者如果n是-1(默认),函数将返回指定位置可用的所有字符。

QString str = "white apple";
QString str1 = str.mid(6, 3); // str1 = "app"

//如果省略第二个参数,mid()返回从指定的起始位置到这个字符串结尾的子串
QString str = "white apple";
QString str1 = str.mid(6); //str1 = "apple"

  (2) 左边截取 left()函数返回最前面的n个字符, 右边截取 right()函数返回最后的n个字符

QString str = "white man";
QString str2 = str.left(5);//str2 = "white"

QString str = "white man";
QString str2 = str.right(3); //str2 = "man"

5. 判断字符串是否包含

   isEmpty函数用于判断字符串是否为空,并返回判断结果

   isNull效果和 isEmpty类似,如果该字符串为空,则返回true;否则返回false。

//判断字符串是否存在
QString().isNull();               // returns true
//判断字符串是否为空
QString().isEmpty();              // returns true

QString("").isNull();             // returns false
QString("").isEmpty();            // returns true
 
QString("abc").isNull();          // returns false
QString("abc").isEmpty();         // returns false

6. 判断字符串是否以某字符开始或者结束

(1)以某物开始,使用startsWith()函数

QString str = "172.168.2.1";
int i = str.startsWith("172."); //i = 1;

(2)以某物结束,使用endsWith()函数

QString str = "172.168.2.112";
int i = str.endsWith(".112"); //i = 1;

7. 大小写切换

  切换为大写,使用toUpper()函数; 切换为小写,使用toLower()函数

QString str = "FileName";
QString str2 = str.toUpper(); //str2 = "FILENAME"

QString str = "FileName";
QString str2 = str.toLower(); //str2 = "filename"

8. 字符串替换

  (1) replace(int position, int n, const QString & after)函数,用字符串替换从索引位置开始的n个字符,并返回对该字符串的引用。
注意:如果指定的位置索引在字符串中,但是position + n超出了字符串范围,那么n将会被调整到在字符串的末尾停止。
 

QString x = "Say yes!";
QString y = "no";
x.replace(4, 3, y);// x == "Say no!"

(2) remove(int position, int n)函数用于从字符串中移除n个字符,从给定的位置开始,并返回对字符串的引用。
如果指定的位置索引在字符串中,但是position + n位于字符串的末尾,那么字符串将在指定位置被截断。

QString s = "Montreal";
s.remove(1, 4);// s == "Meal"

(3) prepend(const QString & str)函数将字符串str预先设置为该字符串的开头,并返回对该字符串的引用。

QString x = "ship";
QString y = "air";
x.prepend(y);// x == "airship"

 (4)  insert函数用于在给定的索引位置插入字符串str,并返回对该字符串的引用。

QString str = "Meal";
str.insert(1, QString("ontr"));// str == "Montreal"

 (5) fill函数用于初始化字符串或给字符串赋值,将字符串中的每个字符设置为字符ch。如果字符串大小与(默认)不同,那么字符串就会预先调整大小。

QString str = "Berlin";
str.fill('z');
// str == "zzzzzz"

str.fill('A', 2);
// str == "AA"

9. 过滤空白字符

(1) 去除字符串首尾空格  

去除字符串两端的空白(空白字符包括回车符号“\n”、换行符“\r”、制表符"\t"和空格字符:“ ”等)非常常用,如获取用户输入账号时就需要去掉空白符。

a. QString::trimmed()函数:移除字符串两端的空白符

b. QString::simplified()函数:移除字符串两端的空白字符,使用单个空格字符“ ”代替字符串中出现的空白字符。

 QString str1 = "   Welcome  \t  to  \n  you!   ";
 QString str2 = "   Welcome  \t  to  \n  you!   ";
 str1 = str1.trimmed();      // str1 = "Welcome \t to \n you!"
 str2 = str2.simplified();     // str2 = "Welcome to you!" 

 (2)去除字符串前面空格

使用正则表达式:
QSring.remove(QRegExp("^ +\\s*"));

QString str = "   aa   ";//字符串aa前后各三个空格
str.remove(QRegExp("^ +\\s*"));
//运行结果: str="aa   ";

(3)去除字符串后面空格

使用正则表达式:
QSring.remove(QRegExp("\\s* +$"));

QString str = "   aa   ";//字符串aa前后各三个空格
str.remove(QRegExp("\\s* +$"));
//运行结果: str="   aa";

(4)删除所有空格

使用正则表达式:
QSring.remove(QRegExp("\\s"));

QString str = "   a c d a   ";//字符串aa前后各三个空格
str.remove(QRegExp("\\s"));
//运行结果: str="acda";

10. 分割字符串

 (1) 一个字符串能被分成为一个装有子串的QStringList,通过使用QString::split()

QString str = "white black yellow";
QStringList color = str.split(" "); 
//color.at(1)为“white”, color.at(2)为“black”,color.at(3)为“yellow”

QByteArray array = tcpSocket->readAll();//从套接字读取数据
QString strr = array;//将数据转换为QString格式
QStringList strlist=strr.split(" ");//将数据以空格拆分,并放入数组中
QStringList list=strlist.at(1).split("#");//将strlist中的第一号元素以“#”隔开并存入list中
qDebug()<

 (2) resize(size)函数用于将字符串的大小设置为size大小。
如果字符串长度大于当前长度,则将字符串扩展为size长度长,并将额外的字符添加到末尾,新字符未初始化。
如果大小小于当前大小,则从末尾删除字符。

QString s = "Hello world";
s.resize(5);
// s == "Hello"

s.resize(8);
// s == "Hello???" ,?代表任何字符

 (3) section()函数用于拆分字符串

这个函数把字符串看成是几个块,这些块由 sep 分隔,start 和 end 指定块号,end 默认为 –1 ,返回的是[ start, end ]内的块组成的字符串,如果 start 和 end 都是负数,那么将从字符串的后面往前面数,返回 [ -end, –start ]内的块组成的字符串。SectionFlags是一些标记,如SectionSkipEmpty表示如果两个分隔符之间是空串,那么就会跳过。
 

QString QString::section ( QChar sep, int start, int end = -1, SectionFlags flags = SectionDefault ) const 
QString str;
QString csv = "forename,middlename,surname,phone";
QString path = "/usr/local/bin/myapp"; // First field is empty 
QString::SectionFlag flag = QString::SectionSkipEmpty;

str = csv.section(',', 2, 2);   // str == "surname"
qDebug()<

/usr/local/bin/myapp按"/"拆分之后为四块 usr local bin myapp
第二块到第三块,即"local/bin",第二块到第四块即"local/bin/myapp",第-4到第-2块【不能是第-2到第-4】,即"usr/local/bin"

section还支持正则表达式:

 QString line = "forename\tmiddlename  surname \t \t phone";
 QRegExp sep("\\s+");
 str = line.section(sep, 2, 2); // s == "surname"
 str = line.section(sep, -3, -2); // s == "middlename  surname"

11. 字符串格式转换
 (1)  QDateTime转为QString

QString str;  
QDateTime time;  
  
time = QDateTime::currentDateTime();  
  
str = time.toString("yyyy-MM-dd hh:mm:ss");  

 (2) QString转为QDateTime

QString str;  
QDateTime time;  
  
str = "2018-04-02 13:35:00";  
  
time = QDateTime::fromString(str, "yyyy-MM-dd hh:mm:ss");  

 (3)const char * 转为 QString

隐式转换: 

str = "( 121 )";

显式显示: 简单地使用一个QString cast,或者调用fromAscii()或fromLatin1()函数

 (4) QString 转为 const char *

使用toAscii()或toLatin1()。 这些函数返回一个QByteArray,它能被转换为一个const char *,通过使用QByteArray::data()或QByteArray::constData()。

QString = "(1178)"
str.toAscii().data();

参考链接:

https://blog.csdn.net/qq_40194498/article/details/79629632

https://blog.csdn.net/xuhui_liu/article/details/72833102

https://blog.csdn.net/weixin_36323170/article/details/85231964

你可能感兴趣的:(QT)