1.6字符串类介绍
字符串是图形界面的基石,虽然控件和图标看起来直观,但还是必定要使用字符串来显示信息。标准C++提供了两种字符串,一种是C语言风格的字符数组,以”\0”结束。另一种是字符串类String,QT字符串类QString功能更加强大。下面将介绍QString 的常见使用,QString 的互相转换、QString 涉及的运算符、QString 字符串查询和操作、利用 QTextStream 对 QString 做输入输出操作等。
1.6.1 QString支持的运算符
= |
赋值运算符。 |
+= |
追加。将运算符左边和右边字符串拼接后,赋值给左边对象。 |
< |
小于号。左边字符串字典序比右边的靠前时,表达式为真。 |
<= |
小于等于。左边字符串字典序比右边的靠前或相同时,表达式为真。 |
== |
等于。二者字典序是一致的时候为真。 |
!= |
不等于。二者字典序不一样的时候为真。 |
> |
大于。左边字符串字典序比右边的靠后时,表达式为真。 |
>= |
大于等于。左边字符串字典序比右边的靠后或相同时,表达式为真。 |
[] |
类似数组取数的中括号,从指定位置取出 QChar 字符,另外还可以修改指定位置的 QChar 字符。 |
+ |
拼接。这是个友元函数,将两个字符串拼接后返回全新的字符串对象。 |
1.6.2 常用的构造类型
QString()
QString(QChar ch)
QString(int size, QChar ch)
QString(const char *str)
QString(const QByteArray &ba)
常用支持传入的类型包括:C语言风格的字符串,QByteArray类型,QChar类型,QString类型。
清空QString字符串可以使用clear()成员函数。 使用QString类需要加#include <QString>头文件。
1.6.3 基本类型转QString类型
以下属于QString类的静态函数接口,可以单独直接调用。number属于重载函数,支持的类型包括C语言风格的字符串,QByteArray类型,QChar类型,QString类型,QLatin1String类型等。
1.整型转QString原型示例:
static QString number(int, int base=10);
2.整数转QString类型示例:
QString str;
str=QString::number(888);
//str =="888"
除了以上的静态函数以外,QString还提供了setNum成员函数实现的相同的功能。setNum也是重载函数,支持的类型与number函数支持的类型一样。
QString &setNum(int n, int base = 10)
3.整数转QString类型示例:
QString str;
str.setNum(888);
//str =="888"
1.6.4 QString类型转基本数据类型
函数接口:
short toShort(bool *ok=0, int base=10) const;
ushort toUShort(bool *ok=0, int base=10) const;
int toInt(bool *ok=0, int base=10) const;
uint toUInt(bool *ok=0, int base=10) const;
long toLong(bool *ok=0, int base=10) const;
ulong toULong(bool *ok=0, int base=10) const;
qlonglong toLongLong(bool *ok=0, int base=10) const;
qulonglong toULongLong(bool *ok=0, int base=10) const;
float toFloat(bool *ok=0) const;
double toDouble(bool *ok=0) const;
示例:
QString str_1("12345");
qDebug()<<"int :"<<str_1.toInt();
qDebug()<<"long :"<<str_1.toLong();
QString str_2("123.45");
qDebug()<<"flaot:"<<str_2.toFloat();
/*
输出结果:
int : 12345
long : 12345
flaot: 123.45
*/
注意:如果QString字符串有小数点,转整型会失败,返回0。
比如:
QString str_2("123.45");
qDebug()<<"int:"<<str_2.toInt(); //输出错误。
1.6.5 QString转QByteArray类型
QByteArray类是QT提供了一个字节数组类,可以通过QByteArray类将QString类的字符串转为C语言风格类型的字符串。QByteArray和QString的方法和属性相似,可以参考QString。
以下是QString类转QByteArray类函数接口:
QByteArray toLatin1() const
QByteArray toLocal8Bit() const //支持中文编码
QByteArray QString::toUtf8() const //转为UTF-8编码
示例:
QString str("12345");
QByteArray text=str.toLocal8Bit();
qDebug()<<text.data(); //转为C语言风格的字符串输出
//输出结果:12345
1.6.6 QString类转char类型字符串
将QString类转为char类型的字符串需要考虑中文的支持。
1.不包含中文的转换方式
QString str("123456789");
char* ch;
QByteArray by = str.toLatin1();
ch=by.data();
qDebug()<<ch;
以上方法当QString里不含中文时,没有问题,但是QString内含有中文时,转换为char*就不正确。
2.包含中文的转换方式
(1)将上面代码的第三行改为:QByteArray by = str.toLoacl8Bit(); //toLoacl8Bit支持中文
(2)先将QString转为标准库中的string类型,然后将string转为char*,如下:
QString str="123456789中文转换输出";
std::string stdstr = str.toStdString();
const char* ch = stdstr.c_str();
qDebug()<<ch;
//输出结果:123456789中文转换输出
1.6.7 字符串拼接
QString重载了”+=”运算符,可以直接使用+=运算符进行拼接。 除了运算符可以进行拼接之外,QString还提供了一个append成员函数来完成拼接功能。
1.append成员函数原型
QString &append(const QString &str)
QString &append(const QChar *str, int len)
QString &append(QChar ch)
QString &append(const QStringRef &reference)
QString &append(QLatin1String str)
QString &append(const char *str)
QString &append(const QByteArray &ba)
2.字符串拼接示例
QString x = "free";
QString y = "dom";
x.append(y);
//x == "freedom"
或者:
QString x = "free";
QString y = "dom";
x+=y;
// x == "freedom"
1.6.8 计算字符串的个数
QString提供了两个函数接口返回当前对象中保存的字符串数据个数。
1.函数原型:
int QString::count() const
int QString::size() const
注意:中文和英文在这里都算做一个。如果要将中文计算为两个字符,需要转为QByteArray类型再计算。
2.示例
QString str("QT5学习");
qDebug()<<str.size();
qDebug()<<str.count();
//结果输出为5
3.示例
QString str("QT5学习");
QByteArray byte=str.toLocal8Bit();
qDebug()<<byte.size();
//结果输出为7
1.6.9 QString标记替换
标记替换类似于C语言中的sprintf格式化打印函数,用来将不同类型的数据转为字符串类型。QString中也提供了支持C语言风格的sprintf函数,用法与C语言中的sprintf函数一样。由于sprintf是属于过时的函数,QT官方推荐QString类中主要使用arg成员函数进行格式打印。
1.函数原型
QString arg(const QString &a, int fieldWidth = 0, QChar fillChar = QLatin1Char( ' ' )) const
arg是一个重载函数。比较多,这里只列出了一个函数,其他函数可以查看QT帮助文档。
(1)字符串替换示例:
QString text("abcd");
text+=QString(" %1 %2 %3 %4").arg("11","22","33","44");
qDebug()<<text;
//结果输出为"abcd 11 22 33 44"
%号就是一个标记符,替换arg成员函数的对应形参。
注意:一个argv的参数字符串替换的%号最大个数为%9。超过了9个需再加一个.arg()即可。
(2)整数替换示例:
QString text("abcd");
text+=QString(" %1 %2 %3 %4").arg(11).arg(22).arg(33).arg(44);
qDebug()<<text;
//结果输出为"abcd 11 22 33 44"
(3)浮点数替换示例:
QString text("abcd");
text+=QString(" %1 %2 %3 %4").arg(11.88).arg(22.88).arg(33.88).arg(44.88);
qDebug()<<text;
//结果输出为"abcd 11.88 22.88 33.88 44.88"
(4)字符替换示例:
QString text("abcd");
text+=QString(" %1 %2 %3 %4").arg('A').arg('B').arg('C').arg('D');
qDebug()<<text;
//结果输出为"abcd A B C D"
1.6.10字符串比较
字符串比较可以设置大小写敏感,compare函数是QString提供的一个静态函数。
1.函数原型
[static] int QString::compare(const QString &s1, const QString &s2, Qt::CaseSensitivity cs = Qt::CaseSensitive)
2.字符串比较示例
int x = QString::compare("aUtO", "AuTo", Qt::CaseInsensitive); // x == 0
int y = QString::compare("auto", "Car", Qt::CaseSensitive); // y > 0
int z = QString::compare("auto", "Car", Qt::CaseInsensitive); // z < 0
3.大小写敏感设置:
enum Qt::CaseSensitivity
Qt::CaseInsensitive 0 //不敏感
Qt::CaseSensitive 1 //敏感
字符串比较也可以使用符号进行比较,QString重载了 > 、 < 、== 、<= 、>=符号。
1.6.11字符串查找
字符串查找在解析字符串数据的时候用的比较多,C语言中可以使用strstr函数进行字符串查找。对于字符串查找功能QString类提供了contains和count两个成员函数。
1.函数原型
bool contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
int QString::count(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
2.大小写敏感设置:
enum Qt::CaseSensitivity
Qt::CaseInsensitive 0 //不敏感
Qt::CaseSensitive 1 //敏感
3.查找指定字符串是否存在:
QString str = "Peter Pan";
str.contains("peter", Qt::CaseInsensitive); // returns true
4.查找字符串出现的次数:
QString str="123132123";
qDebug()<<str.count("123");
//结果输出为2
1.6.12 填充字符串
使某个字符填满字符串,也就是说字符串里的所有字符都有等长度的ch来代替。
QString::fill ( QChar ch, int size = -1 )
//例:
QString str = "Berlin";
str.fill('z');
// str == "zzzzzz"
str.fill('A', 2);
// str == "AA"
1.6.13 从字符串里查找相同的某个字符串str。
int QString::indexOf ( const QString & str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const
例如:
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
1.6.14 指定位置插入字符串
QString & QString::insert ( int position, const QString & str )
例如:
QString str = "Meal";
str.insert(1, QString("ontr"));
// str == "Montreal"
1.6.15 判断字符串是否为空
bool QString::isEmpty () const
例如:
QString().isEmpty(); // returns true
QString("").isEmpty(); // returns true
QString("x").isEmpty(); // returns false
QString("abc").isEmpty(); // returns false
1.6.16 判断字符串是否存在
bool QString::isNull () const
例如:
QString().isNull(); // returns true
QString("").isNull(); // returns false
QString("abc").isNull(); // returns false
1.6.17 从左向右截取字符串
QString QString::left ( int n ) const
例如:
QString x = "Pineapple";
QString y = x.left(4); // y == "Pine"
1.6.18 从中间截取字符串
QString QString::mid ( int position, int n = -1 ) const
例如:
QString x = "Nine pineapples";
QString y = x.mid(5, 4); // y == "pine"
QString z = x.mid(5); // z == "pineapples"
1.6.19 删除字符串中间某个字符
QString & QString::remove ( int position, int n )
例如:
QString s = "Montreal";
s.remove(1, 4);
// s == "Meal"
1.6.20 替换字符串中的某些字符
QString & QString::replace ( int position, int n, const QString & after )
例如:
QString x = "Say yes!";
QString y = "no";
x.replace(4, 3, y);
// x == "Say no!"
1.6.21 以某个字符切割字符串
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"
str = path.section('/', 3, 4); // str == "bin/myapp"
str = path.section('/', 3, 3, flag); // str == "myapp"
1.6.22 把整型,浮点型,或其他类型转化为QString
QString & QString::setNum ( uint n, int base = 10 )