文章目录
- QTCreator使用MSVC中文乱码问题
- QString和QByteArray互转
- QString常用方法
- QByteArray常用方法
- 1.以’\0’结尾
- 2.size()大小,不包含’\0’ ,qstrlen()包含’\0’
- 3.data()返回一个指向所存储的数据对象的指针
- 4.可以使用at()与[]
- 5.可以使用Left(int len) right(int len) mid(int pos, int len)提取
- 6.prepend() append() 分别是从前面和后面添加字符串
- 7.replace
- 8.indexOf
- 9.lastIndexOf
- 10.isNull()和isEmpty()跟QString一样
- 11.chop(int n)从最后删除n个字节
- 12.`int QByteArray::count ( const QByteArray & ba ) const`返回ba在字符数组中出现的次数
- 13.QByteArray::toHex将字节流转换成ACSII编码
- 14.QByteArray::fromHex将ACSII编码转字节流
C++语言提供了两种字符串的实现:C风格的字符串,以’/0‘结尾,
std::string,即标准模版库中的类,
Qt则提供了自己的字符串实现:QString。
QByteArray把数据直接以字节流的方式来对待
QTCreator使用MSVC中文乱码问题
1.项目->编辑器
2.在代码中添加
#pragma execution_character_set("utf-8")
QString和QByteArray互转
1.QString 转QByteArray
QString qs;
QByteArray byteArray = qs.toLatin1();//QT5
2.QByteArray转QString
QByteArray byteArray ;
QString qs= QString(byteArray );
3.QString和int互转
int num = 1;
QString str = QString::number(i);//int转QString ,
QString str = "1";
int num = str.toInt();//QString 转int
4.char*转string
const char *mm = "hello大家好";
QString str = QString(mm);
5.char数组转QByteArray
char*a = new char[10];
memset(a,0,sizeof (a));
a[0] = 0x10;
a[1] = 0x20;
a[2] = 0x30;
a[3] = 0x00;
a[4] = 0x40;
QByteArray arrt = QByteArray(a,5);//一定要指定个数
6.QByteArray 转十六进制QString
方法一:
QString _ByteArrayToHexString(QByteArray data){
QString ret(data.toHex().toUpper());
int len = ret.length()/2;
for(int i=1;i<len;i++)
{
ret.insert(2*i+i-1," ");
}
return ret;
}
方法二:
QString ByteArrayToHexString(QByteArray ascii)//字符串转16进制
{
QString ret;
for(int i = 0; i < ascii.count(); i++)
ret.append(QString("%1 ").arg((uchar)ascii.at(i), 2, 16, (QChar)'0'));
return ret.toUpper();
}
7.十六进制QString转QByteArray
QString aa ;//aa = "10 20 30 00 40"
QByteArray text = QByteArray::fromHex(aa.toLatin1());
//text = 0x10 0x20 0x30 0x00 0x40
QString转十六进制QByteArray
QByteArray data = qstr.toLatin1().toHex();
std::string转QString
std::string str = "123123";
QString qstr = QString::fromStdString(str);
QString常用方法
- QString采用 Unicode 内部编码,字符串的存储有引用计数,当一个 QString 对象被复制为另一个QString 对象时,它们实际上指向相同的存储空间,仅仅是增加一个引用计数。只有在其中一个被修改时才会真正复制一个新的字符串。
- 重载了+,+=,==
常用方法
1.拼接 apped()
str = "hello: ";
str.append("nihao");
str.append("\n");
2.比较 compare()
//返回int类型值,等于0表示相同,不等于0不同
//Qt::CaseInsensitive 这个类型,表示大小写不敏感 Qt::CaseSensitive 表示大小写敏感
QString str="nihao" ;
int nRet = str.compare("nihao",Qt::CaseInsensitive);
3.判空
QString str;
if(str==nullptr){
qDebug("空");
}
if(str==""){
qDebug("空");
}
isNull():判断是否为空对象。
isEmpty():判断是否为空串。
QString a("");
a.isEmpty(); // 真
a.isNull(); // 假
QString b;
b.isEmpty(); // 真
b.isNull(); // 真
4.大小写装换
QString str="niHao" ;
str=str.toLower();//nihao
str=str.toUpper();//NIHAO
QString str="ni\0Hao" ;
str=str.toLower();//ni,toLower()遇到\0停止
str=str.toUpper();//NI,toUpper()遇到\0停止
5.去获取长度,length(),size()遇到\0停止
QString str="nihao" ;
int len=str.length();//这里输出结果为:5
len=str.size();//这里输出结果为:5
len = sizeof(str);//这里输出结果为:8
QString str="ni\0hao" ;
int len=str.length();//这里输出结果为:2
QString 用length()返回字符串的长度,即字节数, 在中英文字符都是以 Unicode 方式编码的,所以,无论中英文都算的长度为 1。
想要取得英文长度为 1 中文长度为 2 的总长度,必须用toLocal8bit()。具体使用方法如下所示:
QString s = “abcd上海上海”;
int length = s.length(); //length = 8;
length = s.toLocal8Bit().length(); //length = 12
6.查找
contains第二参数,默认大小写敏感。
大小写不敏感的比较:Qt::CaseInsensitive
str.contains("hel",Qt::CaseInsensitive);
7.替换
QString str="nihao" ;
str=str.replace("hao","xxx");//nixxx
8.转换
toInt(),toFloat(),toDouble(),toUShort()
9.判断开头结尾是否为指定字符串,正确返回true
QString str="Hel\0lo " ;
bool aaaaa = str.startsWith("H");//第二个参数可以设置大小写敏感
QString str="Hel\0lo " ;
bool aaaaa = str.endsWith("o");//第二个参数可以设置大小写敏感
10.指定位置开始删除n个字符,返回该字符引用
QString str="Hel\0lo " ;
str = str.remove(1,1);//第二个参数可以设置大小写敏感,str=“Hl”
11.分割
split():按照指定的字符分割,返回QStringList
QString str("ab,cd,ef,g,h");
QStringList list = str.split(",");
section函数
QString str = "192.168.7.142";
QString aaa = str.section('.', 0, 0).trimmed();
QString bb = str.section('.', 1, 1).trimmed();
QString cc = str.section('.', 2, 2).trimmed();
QString dd = str.section('.', 3, 3).trimmed();
QString QString::section ( QChar sep, int start, int end =
-1,SectionFlags flags = SectionDefault ) const 这个函数把字符串看成是几个块,这些块由 sep 分隔,start 和 end 指定块号,end 默认为 –1 ,返回的是[ start, end ]内的块组成的字符串,如果 start
和end 都是负数,那么将从字符串的后面往前面数,返回 [ -end,
–start]内的块组成的字符串。SectionFlags是一些标记,如SectionSkipEmpty表示如果两个分隔符之间是空串,那么就会跳过
QStringList QString::split ( const QChar & sep, SplitBehavior behavior
= KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const 这个函数把所有的由 sep 分隔的块装进一个 QStringList 中返回
12.拼接
QString::arg()用法
QString().arg();arg中可以用QByteArray,但是碰到0x00会中断
QString str = QString("%1 %2 %3").arg(1).arg(2.0).arg("hello");
13.获取指定字符串位置
QString temp ="shanghai_123_shanghai_1pudong";
QString str = "shanghai";
int b = temp.indexOf(str,1); //b=13 ,从第一个位置开始查找
14.string和char*互转
string转char*
方法一:有中文字符也可以用
QString str = "hello大家好"; //QString转char *
std::string stdstr = str.toStdString();
const char *mm = stdstr.c_str();
//不能写成const char *mm = str.toStdString().c_str();
15.string和int互转
纯数字
str = "100";
int i = str.toInt();
十六进制
str = "EB8A";
int i = str.toInt(0, 16);
方法二:不能有中文字符
QString str = "hello大家好";
QByteArray byteArr = str.toLocal8Bit();;
const char *mm = byteArr .data();
char*转string
const char *mm = "hello大家好";
QString str = QString(mm);
16.QString查询指定字符串和截取
QString temp ="shanghai_123_shanghai_1pudong";
QString str = "shanghai";
bool bl = temp.contains(str, Qt::CaseSensitive);//bl = true表示存在
int aa = temp.indexOf(str); //aa=0
int b = temp.indexOf(str,1); //b=13 ,从第一个位置开始查找
int e = temp.lastIndexOf(str); // 从后查找 e = 13
int c = temp.indexOf(str, 14); // c=-1
//取出123
QString temp123 = temp.mid(temp.indexOf(str)+str.size()+1,3);//temp123 = "123"
//从左边取出第一个1之前的字符串
QString templeft = temp.left(temp.indexOf("1"));//templeft = "shanghai_"
//取出第二1之后的所有字符串
QString tempright = temp.right(temp.size()- temp.lastIndexOf("1"));//templeft = "1pudong"
QByteArray常用方法
1.以’\0’结尾
2.size()大小,不包含’\0’ ,qstrlen()包含’\0’
3.data()返回一个指向所存储的数据对象的指针
4.可以使用at()与[]
5.可以使用Left(int len) right(int len) mid(int pos, int len)提取
6.prepend() append() 分别是从前面和后面添加字符串
7.replace
8.indexOf
9.lastIndexOf
10.isNull()和isEmpty()跟QString一样
11.chop(int n)从最后删除n个字节
12.int QByteArray::count ( const QByteArray & ba ) const
返回ba在字符数组中出现的次数
13.QByteArray::toHex将字节流转换成ACSII编码
QByteArray byte("123456");
QByteArray byteHex = byte.toHex();//byteHex = "313233343536"
14.QByteArray::fromHex将ACSII编码转字节流
QByteArray byte("31323334");
QByteArray byteFromHex = QByteArray::fromHex(byte);//byteFromHex = 123456