Qt· 常用容器之QString

1、QString的基本用法

1. 将一个字符串追加到另一个字符串的末尾

QString str1 = "hello ";
QString str2 = "world";
str1.append(str2);                   // str1 = "hello world"
str1.append(" !");                   // str1 = "hello world !"

// 对字符串直接 + 另一个字符串也可以实现,但是不对原本的字符串进行操作

QString str3 = str1 + str2 + " !";   // str3 = "hello world !"   str1 = "hello "


2. 从字符串中查找某个字符串

  • QString x = "sticky question";
  • QString y = "sti";
  • int iPos = x.indexOf(y);              // 返回0

// 函数indexOf()会返回要查找的字符串在字符串中第一次出现的位置
// 如果没有要查找的字符串,返回-1


3.从字符串中查找某个字符串最后出现的位置

  • QString strPath = ".C://Users/XXX/Desktop/111.txt";
  • int iPos = strPath.lastIndexOf(".");  // iPos值为26

// 函数indexOf()会返回要查找的字符串在字符串中最后一次出现的位置
// 如果没有要查找的字符串,返回-1
// 一般用于获取一个文件路径后,判断文件的后缀名


4. 用某个字符填满字符串

  • QString str = "Hello";
  • str.fill('x');             // str == "xxxxx"
  • str.fill('A', 2);          // str == "AA"


5. 判断字符串是否为空

  • QString().isEmpty();            // 返回 true
  • QString("").isEmpty();          // 返回 true
  • QString(" ").isEmpty();         // 返回 false
  • QString("abc").isEmpty();       // 返回 false


6. 判断字符串是否存在

  • QString().isNull();             // 返回 true
  • QString("").isNull();           // 返回 false
  • QString("abc").isNull();        // 返回 false


7. 从左向右截取字符串

  • QString str = "Hello World !";
  • QString str1 = str.left(5);         // str1 = "Hello"


8. 从中间截取字符串

  • QString str = "I love C++!";
  • QString str1 = str.mid(2, 4);       // str1 == "love"
  • QString str2 = str.mid(2);          // str2 == "love C++!"

9. 截取字符串中最右边几个字符

  • QString str = "I love C++!";
  • QString str1 = str.right(4);        // str = I love C++! str1 = "C++!" 


10. 删除字符串中的最后几个字符

  • QString str = "Hello World !";
  • str.chop(8);                        // str = "Hello" 


11. 删除字符串中间某个字符

  • QString str = "Hello World!";
  • str.remove(5, 6);                   // str = "Hello!"


12. 指定位置插入字符串

  • QString str = "Hello!";
  • str.insert(5, QString(" World"));   // str = "Hello World!"


13. 用几个字符替换字符串中的几个字符

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


14.字符串补零到指定位

  • QString str = "A6";

//如果要把str补全到8位,空位用0补全

  • QString str1 = QString("%1").arg(str, 8, QLatin1Char('0'));    //str1 = "000000A6"

//arg里第一个参数是要补全的字符串,第二个参数是要补全到的位数,第三个参数是用什么字符补全,可以不是0的其他字符


15.整型十进制转为十六进制字符串并补零到指定位

int n = 66;
//如果要把n转换为十六进制并补全到8位

  • QString str = QString("%1").arg(n, 8, 16, QLatin1Char('0'));   // str = "00000042"

//arg里第一个参数是十进制整型的数,第二个参数是要补全到的位数,第三个参数是要转换的进制,可以是十六进制也可以是十进制
//第四个参数是用什么字符补全,可以不是0的其他字符


16. 以某个字符切割字符串

  • QString csv = "forename,middlename,surname,phone";
  • QString path = "/usr/local/bin/myapp";

 
//section()会把字符串以第一个参数的符号切割分成数个字符串,后面两个参数是得到的字符串的开始和结束的位置

  • QString str;
  • str = csv.section(',', 2, 2);       // str = "surname"
  • str = path.section('/', 3, 3);      // str = "bin"
  • str = path.section('/', 3, 4);      // str = "bin/myapp"
  • str = path.section('/', 3, 3, QString::SectionSkipEmpty);      // str = "myapp"


17. 以某个字符切割字符串另一种方法

  • QString str = "a,,b,c";

 

  • QStringList list1 = str.split(',');
  • // list1: [ "a", "", "b", "c" ]

 

  • QStringList list2 = str.split(',', QString::SkipEmptyParts);
  • // list2: [ "a", "b", "c" ]


18. 检查字符串是否以某个字符串开头或结尾

  • QString str = "http://www.baidu.com";
  • str.startsWith("http:");            // 返回true
  • str.endsWith("cn");                 // 返回false

//这个方法比left()和right()要简单快速,通常用来检查路径或者网址


19. 比较两个字符串是否相等

  • QString str1 = "xxx";
  • QString str2 = "XXX";

 
//localeAwareCompare()会比较两个参数的大小,如果str1小于str2,返回小于0的数,等于返回0,大于返回大于0的数

  • QString::localeAwareCompare(str1, str2)          // 返回 -1

 
//localeAwareCompare()的比较区分大小写,想要不区分大小写,可以使用toLower()或toUpper()使字符串全变成小写或大写

  • if(QString::localeAwareCompare(str1.toUpper(), str2) == 0)
  • {
  •     qDebug() << "str1和str2相等";                // 返回0,输出:str1和str2相等
  • }


20. 去除字符串两侧的空白字符(空白字符包括空格、Tab以及换行符,而不仅仅是空格)

  • QString str = " xxx "; 
  • QString str1 = str.trimmed();    

21.QString其他有用的用法

1、QString::arg()用法

 QString str = QString("%1 %2 %3").arg(1).arg(2.0).arg("hello");
​ %1, %2, %3作为占位符,将被后面的arg()函数中的内容依次替换,比如%1将被替换成1,%2将被替换成2.0,%3将被替换成"hello"。输出为:"1 2 hello"

  • QString::sprintf用法
  • QString
  • str.sprintf("%d %s", 10, "hello");

2、QString与QByteArray之间的关系 


Qt的QByteArray类提供了很方便的对字节流操作的接口,主要应用场合是二进制等;QString是专门用来处理字符串的,除了能处理ASCII编码字符,还包括各国语言的编码,默认情况下QString会把所有数据当做utf-8编码来处理。

QByteArray只是单纯用来处理数据的,除了能处理ASCII编码字符,其它复杂的编码不能处理,直接以字节流的方式来对待。

2.1两者之间的互相转换

 2.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" 

 2.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这是测试"

3、QString与数值类的转换


3.1 QString 转数值

自带各种QString.toXX()函数

3.2 数值 转 QString

第一种用强制类型转换,第二种用QString::number(n,base)

4、QString与char类型的转换


4.1 QString 转换为 char *

将 QString 转 char *,需要用到 QByteArray 类,因为 char * 最后都有一个’\0’作为结束符,而采用 QString::toLatin1() 时会在字符串后面加上’\0’:

  • QString  str;
  • char*  ch;
  • QByteArray ba = str.toLatin1(); // must
  • ch=ba.data();

这样就完成了 QString 向 char * 的转化。经测试程序运行时不会出现 bug。注意第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();

4.2 char * 转换为 QString

将 char * 转换为 QString 比较容易操作,我们可以使用 QString 的构造函数进行转换:

  • QString(const QLatin1String &str);
  • QLatin1String 的构造函数:
  • QLatin1String(const char *str);

因此用下面这个语句就可以将 char * ch 转换为 QString str 了,如下:

  • str = QString(QLatin1String(ch));

4.3 QString 转换为 char []

方法与4.1一样,只是在最最后一句加上:memcpy(); 

  • 1 char* ptr;
  • 2 QByteArray ba;
  • 3 QString str = ui->namelineEdit->text();
  • 4 ba = str.toLatin1();
  • 5 ptr = ba.data();
  • 6 char name[10];
  • 6 memcpy(name,ptr,10); 

4.4char[] 转换为QString

4.4.1最保险的方法

  • char ch_data[512];
  • QString str_data;
  • ...........
  • str_data = QString::fromLocal8Bit(ch_data,512);

4.4.2: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'停止。


5、 QString与CString之间互转

  • inline QString  CS2QS(CString cs) { return  QString::fromWCharArray((LPCTSTR)cs, cs.GetLength()); }
  • inline CString  QS2CS(QString qs) { return  qs.toStdString().c_str(); }


原文链接:https://blog.csdn.net/ljsant/article/details/116782641

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值