Qt5 之 QString 理解与练习

前提概要 (英译汉)

该QString的类提供了一个Unicode字符串。

QString存储一串16位QChar,每个QChar对应一个Unicode 4.0字符。(代码值大于65535的Unicode字符使用代理对存储,即两个连续的QChar。)

Unicode是一种国际标准,支持当今大部分使用的书写系统。它是US-ASCII(ANSI X3.4-1986)和Latin-1(ISO 8859-1)的超集,所有US-ASCII / Latin-1字符都可以在相同的代码位置获得。

在幕后,QString使用隐式共享(copy-on-write)来减少内存使用量并避免不必要的数据复制。这也有助于降低存储16位字符而不是8位字符的固有开销。

除了QString,Qt还提供了QByteArray类来存储原始字节和传统的8位’\ 0’终止的字符串。对于大多数目的而言,QString是您想要使用的类。它在整个Qt API中使用,Unicode支持确保您的应用程序易于翻译,如果您想在某个时候扩展您的应用程序市场。QByteArray适合的两种主要情况是当你需要存储原始二进制数据,并且当内存保存是关键的时候(比如在嵌入式系统中)。


QString 初始化(练习与归纳)

1、构造 QString(空字符串)
原型  QString :: QString()
   QString str;

2、QChar数组转QString
原型  QString::QString(const QChar * unicode,int size = -1)
Note:
    a.构造一个用QChar数组unicode的第一个大小字符初始化的字符串。
    b.如果unicode为0,则构造一个空字符串。
    c.如果大小为负数,则假定unicode指向一个以nul结尾的数组,并且其长度是动态确定的。终止的空字符不被视为字符串的一部分。
    d. QString对字符串数据进行深层复制。unicode数据按原样复制,并且字节顺序标记保留(如果存在)。
例如:
   static const QChar data[4] = { 0x0055, 0x006e, 0x10e3, 0x03a3 };
   QString str(data, 4);
或
   static const QChar data[4] = { "0055", "006e", "10e3", "03a3" };
   QString str(data, 4);

3、由QChar字符对象构造
原型  QString :: QString(int size,QChar ch)
     QString :: QString(QChar ch)

4、先用 resize() 定义 QString 的大小,再根据索引依次赋值
    QString str;
    str.resize(4);
    qDebug() <<"1"<< str << endl;
    str[0] = QChar('U');
    qDebug() <<"2"<< str << endl;
    str[1] = QChar('n');
    qDebug() <<"3"<< str << endl;
    str[2] = QChar(0x10e3);
    qDebug() <<"4"<< str << endl;
    str[3] = QChar(0x03a3);
    qDebug() <<"5"<< str << endl;
打印结果为:
    1 "\u0000\u0000\u0000\u0000" 
    2 "U\u0000\u0000\u0000" 
    3 "Un\u0000\u0000" 
    4 "Un?\u0000" 
    5 "Un?Σ" 
有乱码是因为内存 0x10e30x03a3 为混沌状态。
注意:定义QString大小之后,任然可以对更大的索引空间进行赋值,且不限制于连续索引号

5、字符串构造QString
原型  QString :: QString(const char * str)
例如  QString str("123abc");

6、Latin1编码的字符串构造
原型  QString :: QString(QLatin1String str7、QString浅拷贝构造QString
原型  QString::QString(QString &&other)

8、QString深拷贝构造QString
原型  QString::QString(const QString &other)

9、QByteArray深拷贝构造QString
原型  QString :: QString(const QByteArray&ba)

QString字符串末尾追加字符串

三个相关的Qt库函数:append()、insert()、operator+=()

库函数一:append()
特性:append()函数通常非常快,因为QString会在字符串数据的末尾预先分配额外的空间,所以它可以在不重新分配整个字符串的情况下进行增长。
// 将字符串str追加到该字符串的末尾
QString&QString :: appendconst QString& str)
// 将QChar数组str中的len字符追加到此字符串中
QString&QString :: appendconst QChar * str, int len// 将字符ch附加到此字符串。
QString&QString :: append( QChar ch)
// 将给定的字符串引用附加到此字符串并返回结果
QString&QString :: appendconst QStringRef& reference)
// 将Latin-1字符串str追加到此字符串
QString&QString :: append( QLatin1String str)
// 将字符串str追加到此字符串。使用fromUtf8()函数将给定的const char指针转换为Unicode 。可以通过定义QT_NO_CAST_FROM_ASCII何时编译应用程序来禁用此函数
QString&QString :: appendconst char * str)
// 将字节数组ba添加到此字符串中。也可以通过定义QT_NO_CAST_FROM_ASCII禁用该函数
QString&QString :: appendconst QByteArray& ba)
库函数二: insert()
示例     x.insert(x.size(), y);
库函数三:operator+=()
示例     QString stra = "123", strb = "456";
        stra += strb;

QString字符串格式化

QString QString::arg(const QString&a ,int fieldWidth = 0,QChar fillChar = QLatin1Char(''))const
QString QString::arg(char a,int fieldWidth = 0,QChar fillChar = QLatin1Char(''))const
QString QString::arg(QChar a,int fieldWidth = 0,QChar fillChar = QLatin1Char(''))const
QString QString::arg(long a,int fieldWidth = 0int base = 10,QChar fillChar = QLatin1Char(''))const
QString QString::arg(ulong a,int fieldWidth = 0int base = 10,QChar fillChar = QLatin1Char(''))const
QString QString::arg(int a,int fieldWidth = 0int base = 10,QChar fillChar = QLatin1Char(''))const
QString QString::arg(uint a,int fieldWidth = 0int base = 10,QChar fillChar = QLatin1Char(''))const
QString QString::arg(short a,int fieldWidth = 0int base = 10,QChar fillChar = QLatin1Char(''))const
QString QString::arg(ushort a,int fieldWidth = 0int base = 10, QChar fillChar = QLatin1Char(''))const
QString QString::arg(double a,int fieldWidth = 0char format ='g'int precision = -1,QChar fillChar = QLatin1Char(''))const
QString QString::arg(qlonglong a,int fieldWidth = 0int base = 10, QChar fillChar = QLatin1Char(''))const
QString QString::arg(const QString& a1,const QString& a2)const
QString QString::arg(const QString& a1,const QString& a2,const QString& a3)const
QString QString::arg(const QString& a1,const QString& a2,const QString& a3,const QString& a4)const
QString QString::arg(const QString& a1,const QString& a2,const QString& a3,const QString& a4,const QString& a5)const
QString QString::arg(const QString& a1,const QString& a2,const QString& a3,const QString& a4,const QString& a5,const QString& a6)const
QString QString::arg(const QString& a1,const QString& a2,const QString& a3,const QString& a4,const QString& a5,const QString& a6,const QString& a7)const
QString QString::arg(const QString& a1,const QString& a2,const QString& a3,const QString& a4,const QString& a5,const QString& a6,const QString& a7,const QString& a8)const
QString QString::arg(const QString& a1,const QString& a2,const QString& a3,const QString& a4,const QString& a5,const QString& a6,const QString& a7,const QString& a8,const QString& a9)const

arg的重载形式共 19 个,有点多,这里归纳下(根据序号描述):
1-2:参数一是字符串
3:参数一可能是字符串,也可能是16进制的数值
4~11:参数一是数值,参数三可指定进制(2、8、10、16)
12~19:每个参数都是一个 “%”,实现一次性替换

注意13-20的重载形式有个坑:
BUG:当编号的位置标记不是空格分隔时会发生类似的问题

  QString str; 
  str =  "%1%3%2"; 
  str.arg("Hello").arg(20).arg(50); //返回“Hello500”

  str =  "%1%2%3";
  str.arg("Hello").arg(50).arg(20); //返回“Hello5020”

程序执行步骤
1、首先,Hello替换%1这样的字符串变成”Hello%3%2”。
2、然后,20替换%2这样的字符串变成”Hello%320”。
3、由于最大编号的位置标记值为99,因此会被50替换%32。
因此,最终变成了”Hello500”。

如何避开?
假设 “%” 的编号顺序不是 从左至右,咱们可以这样避开BUG

  QString str;
  str = "%1%2%3";
  str.arg("Hello", QString::number(20), QString::number(50)); // returns "Hello5020"

另外,还有 asprintf() 和 QTextStream() ,暂且不做它俩相应的练习


删除QString字符串末尾的指定长度字符

原型 void QString :: chop(int n)
注意 如果n大于或等于size(),则结果为空字符串; 如果n是负数,则相当于传递零。
用法

QString str("LOGOUT\r\n");
  str.chop(2);
  // str == "LOGOUT"

返回QString字符串左边指定长度字符

原型 void QString::truncate(int position)
注意 如果指定的位置索引超出了字符串的末尾,则不会发生任何事情。
用法

  QString str = "Vladivostok";
  str.truncate(4);
  // str == "Vlad"

移除QString字符串指定索引的指定长度字符(并返回最新字符串)

原型 QString&QString :: remove( int position, int n)
注意 如果指定的位置索引位于字符串内,但位置 + n超出了字符串的末尾,则字符串将在指定的位置截断
用法

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

删除QString字符串中的某个字符(可区分大小写)

原型 QString&QString :: remove( QChar ch, Qt :: CaseSensitivity cs = Qt :: CaseSensitive)
注意 默认是Qt :: CaseSensitivity,即默认不分大小写,且参数ch不限制搜索字符或字符串
用法

  QString t = "Ali Baba";
  t.remove(QChar('a'), Qt::CaseInsensitive);
  // t == "li Bb"
或
  replace(t, 'a', Qt::CaseInsensitive);

在QString字符串中删除正则匹配的字符串

原型1 QString &QString::remove(const QRegExp &rx)
原型2 QString&QString :: remove(const QRegularExpression& re)
注意 区别在于 QRegExp 和 QRegularExpression
用法

  QString r = "Telephone";
  r.remove(QRegExp("[aeiou]."));
  // r == "The"

  QString r = "Telephone";
  r.remove(QRegularExpression("[aeiou]."));
  // r == "The"

返回一个字符串的复数

原型 QString QString::repeated(int times) const
注意 如果times小于1,则返回空字符串
用法

  QString str("ab");
  str.repeated(4);            // returns "abababab"

替换QString字符串中指定范围的子字符串

原型 QString &QString::replace(int position, int n, const QString &after)
注意 如果指定的位置索引位于字符串内,但位置 + n超出了字符串范围,则将调整n以停止在字符串末尾
用法

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

QString返回一个小写字符串

原型 QString QString :: toLower()const
用法

  QString str = "The Qt PROJECT";
  str = str.toLower();        // str == "the qt project"

QString返回一个大写字符串

原型 QString QString::toUpper() const
用法

  QString str = "TeXt";
  str = str.toUpper();        // str == "TEXT"

数据类型转换

最终参数ok的值会表达转换是否成功
QString转qint64:
原型 qlonglong QString::toLongLong(bool *ok = Q_NULLPTR, int base = 10) const

  QString str = "FF";
  bool ok;
  qint64 hex = str.toLongLong(&ok, 16);      // hex == 255, ok == true
  qint64 dec = str.toLongLong(&ok, 10);      // dec == 0, ok == false

QString转long:
原型 long QString::toLong(bool *ok = Q_NULLPTR, int base = 10) const

  QString str = "FF";
  bool ok;

  long hex = str.toLong(&ok, 16);     // hex == 255, ok == true
  long dec = str.toLong(&ok, 10);     // dec == 0, ok == false

QString转double
原型 double QString::toDouble(bool *ok = Q_NULLPTR) const

  QString str = "1234.56";
  double val = str.toDouble();   // val == 1234.56
或
  bool ok;
  double d;
  d = QString( "1,234,567.89" ).toDouble(&ok); // ok == false
  d = QString( "1234,56" ).toDouble(&ok); // ok == false
  d = QString( "1234.56" ).toDouble(&ok); // ok == true, d == 1234.56

数值转QString字符串
库函数 setNum
QString都可以由这些类型转换:ushort、short、uint、long、ulong、qlonglong、float、double
用法

    uint len = 0x20;
    QString str;
    str.setNum(len, 16);
注意 float 和 double 的重载形式可以用参数二设置语言的格式

拆分QString字符串
库函数一:split
库函数二:splitRef
库函数三:section
区别:返回数据的类型不同,一是返回QStringList,二是返回QVector < QStringRef >

split重载形式有:
QStringList QString :: splitconst QString& sep, SplitBehavior behavior = KeepEmptyParts, Qt :: CaseSensitivity cs = Qt :: CaseSensitive)const
QStringList QString :: split( QChar sep, SplitBehavior behavior = KeepEmptyParts, Qt :: CaseSensitivity cs = Qt :: CaseSensitive)const
QStringList QString :: splitconst QRegExp& rx, SplitBehavior behavior = KeepEmptyParts)const
QStringList QString :: splitconst QRegularExpression& re, SplitBehavior behavior = KeepEmptyParts)const
splitRef重载形式有:
QVector < QStringRef > QString :: splitRef(const QString& sep, SplitBehavior behavior = KeepEmptyParts, Qt :: CaseSensitivity cs = Qt :: CaseSensitive)const
QVector < QStringRef > QString :: splitRef( QChar sep, SplitBehavior behavior = KeepEmptyParts, Qt :: CaseSensitivity cs = Qt :: CaseSensitive)const
QVector < QStringRef > QString :: splitRef(const QRegExp& rx, SplitBehavior behavior = KeepEmptyParts)const
QVector < QStringRef > QString :: splitRef(const QRegularExpression& re, SplitBehavior behavior = KeepEmptyParts)const

split 和 splitRef 重载形式的规律
参数一输入类型有 const QString、QChar、const QRegExp、const QRegularExpression
参数二是设置大小写匹配是否开启,默认不开启

section重载形式
QString QString::section(QChar sep, int start, int end = -1, SectionFlags flags = SectionDefault) const
QString QString::section(const QString &sep, int start, int end = -1, SectionFlags flags = SectionDefault) const
QString QString::section(const QRegExp &reg, int start, int end = -1, SectionFlags flags = SectionDefault) const
QString QString::section(const QRegularExpression &re, int start, int end = -1, SectionFlags flags = SectionDefault) const

理解 根据参数一的要求,将字符串拆分为子字符串,然后参数二选定从第几个子字符串开始,而参数三选定从第几个字符串结束,并返回这个范围的字符串的引用。(参数flags是一个枚举类型,对应的枚举值会影响返回的行为)

注意 返回的所有引用都是会跟着字符串的销毁而变为野指针,只是浅拷贝的实例而已。


去除QString开头与结尾的空白 以及中间的特殊字符
原型 QString QString::simplified() const
用法

  QString str = "  lots\t of\nwhitespace\r\n ";
  str = str.simplified();
  // str == "lots of whitespace";

返回QString字符串的字符个数
原型 int QString::size() const
用法

  QString str = "World";
  int n = str.size();         // n == 5

两个QString字符串快速交换值
原型 void QString :: swap(QString&other)

    QString a = "123";
    QString b = "456";
    a.swap(b);
    qDebug()<< a <<endl; // "456"
    qDebug()<< b <<endl; // "123"

截取QString字符串
截取右边字符串 :QString QString::right(int n) const
截取左边字符串 :QString QString::left(int n) const
范围截取字符串 :QString QString::mid(int position, int n = -1) const

QString str = "123";
QString str1 = str.right(2); //str1 == 23 
QString str2 = str.left(2);  //str2 == 12
QString str3 = str.mid(0,2); //str3 == 12

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值