QT中QString的⽤法总结
QT经常使⽤过程中难免会涉及到各种字符类的转换,如MFC中的CString,C++标准类的string 以及QT中的QString。每个类都有⾃⼰的⽤法,今天主要总结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/";
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
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!";
12. 指定位置插⼊字符串
QString str = "Hello!";
str.insert(5, QString(" World"));  // str = "Hello World!"
13. ⽤⼏个字符替换字符串中的⼏个字符
QString x = "Say yes!";
QString y = "no";
14.字符串补零到指定位
QString str = "A6";
isnull的用法//如果要把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的其他字符
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 = "www.baidu";
str.startsWith("http:");            // 返回true
//这个⽅法⽐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::Upper(), str2) == 0)
{
qDebug() << "str1和str2相等";                // 返回0,输出:str1和str2相等
}
20. 去除字符串两侧的空⽩字符(空⽩字符包括空格、Tab以及换⾏符,⽽不仅仅是空格)
QString str = " xxx ";
QString str1 = immed();
21.QString其他有⽤的⽤法
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 = Latin1(); //按照ASCII编码转换,⽆法转换中⽂
QByteArray byte2 = Utf8();    //按照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 转数值
⾃带各种XX()函数
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 = Latin1(); // must
ch=ba.data();
这样就完成了 QString 向 char * 的转化。经测试程序运⾏时不会出现 bug。注意第3⾏,⼀定要加上,不可以 Latin1().data() 这样⼀步完成,否则可能会出错。补充:以上⽅法当 QString ⾥不含中⽂时,没有问题,但是 QString 内含有中⽂时,转换为 char * 就是乱码,采⽤如下⽅法解决:
⽅法1:
添加GBK编码⽀持:
#include <QTextCodec>
QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
然后将上⾯的第3⾏修改为:
QByteArray ba = Local8Bit(); // toLocal8Bit ⽀持中⽂
⽅法2:
先将 QString 转为标准库中的 string 类型,然后将 string 转为 char *。如下:
QString  filename;
std::string str = StdString();
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 = Latin1();
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之间互转

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。