5_1_1_Qt字符串类QString的基本使用

来源:互联网 发布:mac开机密码 编辑:程序博客网 时间:2024/06/10 10:59
1.WHAT
------1)标准C++提供了两种字符串:一种是C语言风格以“\0”字符结尾的字符数组;另一种是字符串类String。而Qt给我们提供的字符串类QString功能更强大。
------2)QString类保存16位Unicode值,提供了丰富的操作,查询和转换等函数。

2.HOW(需要包含头文件<QString>)
------1)字符串的操作:创建字符串对象(测试项目是QWidget的基类,无UI)
  1. //创建字符串对象
  2. QString s1("hello"); //使用字符常量构造:const char *
  3. QString s2 = "qt"; //使用赋值构
------2)字符串拼接
---------①QString也提供了一个二元的“+”操作符用于组合两个字符串,并提供了“+=”操作符用于将一个字符串追加到另一个字符串的末尾(运算符重载),也可用append追加字符串。
  1. //运算符重载,拼接字符串
  2. QString s3 =s1+s2;
  3. qDebug() <<"s3="<<s3; //s3= "hello qt"
  4. s3 += "!"; //或者+=QString对象
  5. qDebug() <<"s3="<<s3; //s3= "hello qt!"
  6. //append方式追加
  7. QString s4 = "hello";
  8. s4.append(" world!"); //使用append方式追加
  9. qDebug() <<"s4="<<s4; //s4= "hello world!
---------②QString::sprintf();//不常用,功能和C++定义一样,设计到编码问题qt中很少使用,尤其涉及到使用变量组包的时候
  1. //sprintf方式实现:很少用
  2. QString s10;
  3. s10.sprintf("%s","Welcom1e");
  4. qDebug() <<"s10="<<s10; //s10= "Welcom1e"
  5. s10.sprintf("%s","to you!");
  6. qDebug()<<"s10="<<s10; //s10= "to you!"
  7. s10.sprintf("%s %s","Welcome","to you!");
  8. qDebug() <<"s10="<<s10; //s10= "Welcome to you!"
---------③QString::arg();    //常用的组包方式
               此函数可以重载处理很多种数据类型,此外,一些重载具有额外的参数,对字段的宽度、整型、浮点型的精度进行控制。通常,相对于函数QString::sprintf(),这个函数是一个比较好的解决方案,因为类型安全,完全支持Unicode,允许改变“%n”参数的顺序,例如:
  1. //QString::arg();
  2. QString s20 = "yongheng0";
  3. int n = 852;
  4. QString s21 = QString("%1.%2%4.%3").arg("www").arg(s20).arg("com").arg(n);
  5. qDebug()<<"s21="<<s21; //s21= "www.yongheng0852.com"
  6. //等价于
  7. QString s22 = "www." +s20 + QString::number(n)+ ".com";
  8. qDebug() <<"s22="<<s22; //s22= "www.yongheng0852.com"
------------a)%1:使用“arg("www")”替换
------------b)%2:使用 字符串对象“arg(s20)”的内容yongheng0替换
------------c)%4:使用  整型变量“arg(n)”的内容 852 替换
------------d)%3:使用“arg("com")”替换
------------e)等价于:22 = "www." +s20 + QString::number(n)+ ".com";//但这种+的方式不利于格式化方式组包。
---------④ 其他方式的字符串操作:QString也提供了一些其他组合字符串的方法包括以下几种:
------------a)insert()在字符串的任意位置插入一个字符串
  1. //insert()在字符串的任意位置插入一个字符串
  2. QString s30 = "yongheng.com";
  3. QString s31 = "0852";
  4. s30.insert(8,&s31); //在字符串第8个位置插入s31这个字符串
  5. qDebug() <<"s30="<<s30; //s30= "yongheng0852.com"
------------b)prepend()在字符串的开头位置插入一个字符串
  1. s30.prepend("www.");
  2. qDebug() <<"s30="<<s30; //s30= "www.yongheng0852.com"
------------c)replace()字符串替换
  1. s30.replace("www","http://www"); //把www替换为http方式
  2. qDebug()<<"s30="<<s30; //s30= "http://www.yongheng0852.com"
------------d)trimmed()移除两端的空白字符
  1. //trimmed()移除两端的空白字符
  2. QString s40 = " www.\tyongheng0852.\ncom ";
  3. qDebug()<<"s40="<<s40; //s40= " www.\tyongheng0852.\ncom "
  4. s40 = s40.trimmed(); //返回一个去除空格的对象
  5. qDebug() <<"s40="<<s40; //s40= "www.\tyongheng0852.\ncom"
------------b)simplified()移除两端空表字符和中间的特殊转义字符(转义字符用空格替换)
  1. //simplified()移除两端空表字符和中间的特殊转移字符(用空格替换)
  2. QString s41 = " hello\nworld\t! ";
  3. qDebug()<<"s41="<<s41; //s41= " hello\nworld\t! "
  4. s41 = s41.simplified();
  5. qDebug()<<"s41="<<s41; //s41= "hello world !"

------3)查询字符串的数据
---------①startsWith();    以某个字符串开头
            (有两个参数,第一个参数是需要查找的字符串,第二个参数是,是否区分大小写,第二个参数可以不写,默认是区分大小写的)
            (Sensitive:敏感的; Insensitive 不敏感的)
  1. QString s50 = "www.yongheng0852.com";
  2. qDebug()<<s50.startsWith("www."); //默认区分大小写,返回true
  3. qDebug()<<s50.startsWith("wWw."); //默认区分大小写,返回false
  4. qDebug()<<s50.startsWith("wWw",Qt::CaseSensitive); //区分大小写.返回false
  5. qDebug()<<s50.startsWith("wWw",Qt::CaseInsensitive); //忽略大小写,返回true
---------②endWith();    以某个字符串结尾(和startWith用法类似)
  1. qDebug() << s50.endsWith("coM",Qt::CaseInsensitive); //忽略大小写,返回true
---------③ contains();判断是否包含某个字符串
  1. qDebug()<<s50.contains("yongHENG",Qt::CaseSensitive); //区分大小写:false
  2. qDebug()<<s50.contains("yongHENG",Qt::CaseInsensitive); //不区分大小写:true
------4)比较字符串大小
              和c/c++一样是以ascii码的方式比较字符串,当第一个字符不相同时,结果就确定,不会再继续向下面比较。 a<z(ascii)
---------①运算符重载"<,<=,==<,>,>=";    运算符左边的ascii码和右边的ascii逐位比较,结果为bool类型。
  1. QString s60 = "cabc";
  2. //重载比较运算符,返回bool
  3. qDebug() << (s60 < "b"); //false
  4. qDebug() << (s60 <= "b"); //false
  5. qDebug()<< (s60 == "b"); //false
  6. qDebug()<< (s60 > "b"); //true
  7. qDebug() << (s60 >= "b"); //true
  8. qDebug() << (s60 < "d"); //true
---------②localeAwareCompare();使用本地字符集locale比较,返回整型,大于返回正整数,等于返回0,小于返回负整数
                (有两个参数,分别为需要比较的字符串)
  1. int ret = 0;
  2. ret =QString::localeAwareCompare(s60,"abcdef"); //ret= 1
  3. qDebug()<<"ret="<<ret;
  4. ret =QString::localeAwareCompare(s60,"cabc"); //ret= 0
  5. qDebug() <<"ret="<<ret;
  6. ret =QString::localeAwareCompare(s60,"gabcef"); //ret= -1
  7. qDebug() <<"ret="<<ret;
---------③QString::compare();可指定区分大小写的比较,如果不相等,返回值和localeAwareCompare的返回值方式类似。
  1. ret = QString::compare("bcd","bcd"); //默认区分大小写:0
  2. qDebug() <<"ret="<<ret;
  3. ret = QString::compare("bcd","Bcd"); //默认区分大小写:32
  4. qDebug() <<"ret="<<ret;
  5. ret = QString::compare("bcd","Bcd",Qt::CaseSensitive); //区分大小写:32
  6. qDebug() <<"ret="<<ret;
  7. ret = QString::compare("bcd","Bcd",Qt::CaseInsensitive); //不区分大小写:0
  8. qDebug()<<"ret="<<ret;
------5)字符串转换
---------①字符串 -->  基础数据(int等):
                函数原型:(int QString::toInt(bool *ok = Q_NULLPTR, int base = 10) const)
                参数1接收转换的结果,转成功为true,失败false,参数2,是指定字符串内的原始数据是多少进制的,也就是说,是需要把字符串中的数据是以多少进制转换为10进制。)
                参数1和参数2可以不指定,参数1不指定时,不接收转换结果。
参数2不指定时默认字符串中的数据是10进制的)
                参数2不指定时,默认为10进制,如果设置为0时,则会使用c语言的转换方法,即:如果字符串以“0x”开头,则基数为16,如果以“0”开头,则基数为8,其他情况,基数都为10;
------------a)QString::toInt(无参数);    
  1. QString s70 = "0168";
  2. int a70 = s70.toInt();
  3. qDebug()<<"a70="<<a70; //a70= 168
  4.  
  5. s70 = "0.168";
  6. double a71 = s70.toDouble();
  7. qDebug() <<"a71="<<a71; //a71= 0.168
  8.  
  9. s70 = "hello qt";
  10. a70 = s70.toInt();
  11. qDebug()<<"a70="<<a70; //转换失败,数据为0
---------②QString::toInt(参数1,参数2);  对转换结果进行判断,并按照指定的进制基数进行转换。
  1. bool ok = false;
  2. s70 = "0168";
  3. a70 = s70.toInt(&ok,16); //指定字符串中的数据是16进制,把他转换为10进制
  4. if(ok)
  5. {
  6. qDebug()<<"s70 = 0168:"<<"16进制转换10进制成功,数据是:"<<a70; //数据是:360
  7. }
  8. else
  9. {
  10. qDebug()<<"s70 = 0168:"<<"16进制转换10进制失败!";
  11. }
  12.  
  13. s70 = "0167"; //如果数据超过了8进制的范围,则转换失败
  14. a70 = s70.toInt(&ok,8);
  15. if(ok)
  16. {
  17. qDebug()<<"s70 = 0167:"<<"8进制转换10进制成功,数据是:"<<a70; //数据是:119
  18. }
  19. else
  20. {
  21. qDebug()<<"s70 = 0167:"<<"8进制转换10进制失败!";
  22. }
  23.  
  24. s70 = "hello qt";
  25. a70 = s70.toInt(&ok); //不指定第二个参数默认转换为10进制
  26. if(ok)
  27. {
  28. qDebug()<<"s70 = hello qt :"<<"转换成功,数据是:"<<a70;
  29. }
  30. else
  31. {
  32. qDebug()<<"s70 = hello qt :"<<"转换失败!"; //数据转换失败
  33. }
---------②基础数据(int等) --> 字符串:
------------a)QString::arg(); 组包的方式:
  1. int b = 100;
  2. QString s80 = QString("%1").arg(b);
  3. qDebug() <<"s80="<<s80; //s80= "100"
------------b)QString::number(); 更简便的方式:
  1. b = 200;
  2. s80 = QString::number(b);
  3. qDebug()<<"s80="<<s80; //s80= "200"
  4.  
  5. double d = 0.852;
  6. s80 = QString::number(d);
  7. qDebug() <<"s80="<<s80; //s80= "0.852"
---------③标准string和QTstring的互换(引入了c++的iostream的头文件,和string头文件)
  1. //QString 转C++ string:
  2. QString q_str1 = "hello";
  3. std::string c_str1 = q_str1.toStdString();
  4. std::cout<<"QString 转C++ string="<<c_str1<<std::endl;
  5.  
  6. //C++ string 转QString:
  7. std::string c_str2 = "world";
  8.  
  9. QString q_str2 = QString::fromStdString(c_str2);
  10. qDebug()<<"C++ string 转QString="<<q_str2;
------6)NULL字符串和Empty空字符串的区别
               一个NULL字符串是使用QString的默认构造或者使用“(const char*)0”作为参数的构造函数创建的QString字符串对象;而一个空字符串是一个大小为0的字符串,一个NULL字符串一定是一个字符串,而一个空字符串未必是一个NULL字符串。例如:
  1. QString s81 = QString();
  2. qDebug()<<s81.isNull(); //true
  3. qDebug()<<s81.isEmpty(); //true
  4.  
  5. QString s82 = QString("");
  6. qDebug()t<<s82.isNull(); //false
  7. qDebug()<<s82.isEmpty(); //true
  8.  
  9. qDebug()<<"以下代码和上面等价:";
  10. qDebug()<<QString().isNull(); //true
  11. qDebug()<<QString().isEmpty(); //true
  12. qDebug()<<QString("").isNull(); //false
  13. qDebug()<<QString("").isEmpty(); //true
------7)工程项目是创建了一个 QWidget的基类的无UI项目,测试代码都写在widget.cpp的构造函数里面。
---------①代码:
  1. #include "widget.h"
  2. #include<QString>
  3. #include<QDebug>
  4.  
  5. #include <iostream>
  6. #include <string> //c++的string类
  7.  
  8. Widget::Widget(QWidget *parent)
  9. : QWidget(parent)
  10. {
  11. //创建字符串对象--------------------------------------
  12. QString s1("hello"); //使用字符常量构造:const char *
  13. QString s2 = " qt"; //使用赋值构造
  14.  
  15. qDebug()<<"--------------运算符重载,拼接字符串--------------";
  16. QString s3 =s1+s2;
  17. qDebug() <<"s3="<<s3; //s3= "hello qt"
  18. s3 += "!"; //或者+=QString对象
  19. qDebug() <<"s3="<<s3; //s3= "hello qt!"
  20. //append方式追加
  21. QString s4 = "hello";
  22. s4.append(" world!"); //使用append方式追加
  23. qDebug() <<"s4="<<s4; //s4= "hello world!"
  24.  
  25.  
  26. qDebug()<<"--------------sprintf方式实现:很少用--------------";
  27. QString s10;
  28. s10.sprintf("%s","Welcom1e");
  29. qDebug() <<"s10="<<s10; //s10= "Welcom1e"
  30. s10.sprintf("%s","to you!");
  31. qDebug() <<"s10="<<s10; //s10= "to you!"
  32. s10.sprintf("%s %s","Welcome","to you!");
  33. qDebug() <<"s10="<<s10; //s10= "Welcome to you!"
  34.  
  35. qDebug()<<"--------------组包:QString::arg()--------------";
  36. QString s20 = "yongheng0";
  37. int n = 852;
  38. QString s21 = QString("%1.%2%4.%3").arg("www").arg(s20).arg("com").arg(n);
  39. qDebug() <<"s21="<<s21; //s21= "www.yongheng0852.com"
  40. //等价于
  41. QString s22 = "www." +s20 + QString::number(n)+ ".com";
  42. qDebug() <<"s22="<<s22; //s22= "www.yongheng0852.com"
  43.  
  44. qDebug()<<"--------------其他组合字符串的方式--------------";
  45. //insert()在字符串的任意位置插入一个字符串
  46. QString s30 = "yongheng.com";
  47. QString s31 = "0852";
  48. s30.insert(8,&s31); //在字符串第8个位置插入s31这个字符串
  49. qDebug() <<"s30="<<s30; //s30= "yongheng0852.com"
  50. //prepend()在字符串的开头位置插入一个字符串
  51. s30.prepend("www.");
  52. qDebug() <<"s30="<<s30; //s30= "www.yongheng0852.com"
  53.  
  54. qDebug()<<"--------------replace()字符串替换--------------";
  55. s30.replace("www","http://www"); //把www替换为http方式
  56. qDebug() <<"s30="<<s30; //s30= "http://www.yongheng0852.com"
  57.  
  58. qDebug()<<"--------------trimmed()移除两端的空白字符--------------";
  59. QString s40 = " www.\tyongheng0852.\ncom ";
  60. qDebug() <<"s40="<<s40; //s40= " www.\tyongheng0852.\ncom "
  61. s40 = s40.trimmed(); //返回一个去除空格的对象
  62. qDebug() <<"s40="<<s40; //s40= "www.\tyongheng0852.\ncom"
  63.  
  64. //simplified()移除两端空表字符和中间的特殊转移字符(用空格替换)
  65. QString s41 = " hello\nworld\t! ";
  66. qDebug() <<"s41="<<s41; //s41= " hello\nworld\t! "
  67. s41 = s41.simplified();
  68. qDebug() <<"s41="<<s41; //s41= "hello world !"
  69.  
  70. //查询字符串数据-----------------------------------------
  71. qDebug()<<"--------------以某个字符串开头或结尾:s50--------------";
  72. QString s50 = "www.yongheng0852.com";
  73. qDebug()<<s50.startsWith("www."); //默认区分大小写,返回true
  74. qDebug()<<s50.startsWith("wWw."); //默认区分大小写,返回false
  75. qDebug()<<s50.startsWith("wWw",Qt::CaseSensitive); //区分大小写.返回false
  76. qDebug()<<s50.startsWith("wWw",Qt::CaseInsensitive); //忽略大小写,返回true
  77.  
  78. //以某个字符串结尾(和startWith用法类似)
  79. qDebug() << s50.endsWith("coM",Qt::CaseInsensitive); //忽略大小写,返回true
  80.  
  81. //判断是否包含某个字符串
  82. qDebug()<<"判断是否包含某个字符串:s50";
  83. qDebug()<<s50.contains("yongHENG",Qt::CaseSensitive); //区分大小写:false
  84. qDebug()<<s50.contains("yongHENG",Qt::CaseInsensitive); //不区分大小写:true
  85.  
  86. //比较字符串大小:以ascii码的大小比较,a<z----------------------------
  87. qDebug()<<"--------------比较字符串大小:s60--------------";
  88. QString s60 = "cabc";
  89. //重载比较运算符,返回bool
  90. qDebug() << (s60 < "b"); //false
  91. qDebug() << (s60 <= "b"); //false
  92. qDebug() << (s60 == "b"); //false
  93. qDebug() << (s60 > "b"); //true
  94. qDebug() << (s60 >= "b"); //true
  95. qDebug() << (s60 < "d"); //true
  96. //使用本地字符集locale比较,返回整型,大于返回正整数,等于返回0,小于返回负整数
  97. int ret = 0;
  98. ret =QString::localeAwareCompare(s60,"abcdef"); //ret= 1
  99. qDebug() <<"ret="<<ret;
  100. ret =QString::localeAwareCompare(s60,"cabc"); //ret= 0
  101. qDebug() <<"ret="<<ret;
  102. ret =QString::localeAwareCompare(s60,"gabcef"); //ret= -1
  103. qDebug() <<"ret="<<ret;
  104. //可指定区分大小写的比较,如果不相等,返回值和localeAwareCompare的返回值方式类似
  105. ret = QString::compare("bcd","bcd"); //默认区分大小写:0
  106. qDebug() <<"ret="<<ret;
  107. ret = QString::compare("bcd","Bcd"); //默认区分大小写:32
  108. qDebug() <<"ret="<<ret;
  109. ret = QString::compare("bcd","Bcd",Qt::CaseSensitive); //区分大小写:32
  110. qDebug() <<"ret="<<ret;
  111. ret = QString::compare("bcd","Bcd",Qt::CaseInsensitive); //不区分大小写:0
  112. qDebug() <<"ret="<<ret;
  113.  
  114. //字符串转换----------------------------
  115. qDebug()<<"--------------字符串->数据(int等)--------------";
  116. QString s70 = "0168";
  117. int a70 = s70.toInt();
  118. qDebug() <<"a70="<<a70; //a70= 168
  119.  
  120. s70 = "0.168";
  121. double a71 = s70.toDouble();
  122. qDebug() <<"a71="<<a71; //a71= 0.168
  123.  
  124. s70 = "hello qt";
  125. a70 = s70.toInt();
  126. qDebug() <<"a70="<<a70; //转换失败,数据为0
  127.  
  128. //对转换结果进行判断-----------------------
  129. bool ok = false;
  130. s70 = "0168";
  131. a70 = s70.toInt(&ok,16); //指定字符串中的数据是16进制,把他转换为10进制
  132. if(ok)
  133. {
  134. qDebug()<<"s70 = 0168:"<<"16进制转换10进制成功,数据是:"<<a70; //数据是:360
  135. }
  136. else
  137. {
  138. qDebug()<<"s70 = 0168:"<<"16进制转换10进制失败!";
  139. }
  140.  
  141. s70 = "0167"; //如果数据超过了8进制的范围,则转换失败
  142. a70 = s70.toInt(&ok,8);
  143. if(ok)
  144. {
  145. qDebug()<<"s70 = 0167:"<<"8进制转换10进制成功,数据是:"<<a70; //数据是:119
  146. }
  147. else
  148. {
  149. qDebug()<<"s70 = 0167:"<<"8进制转换10进制失败!";
  150. }
  151.  
  152. s70 = "hello qt";
  153. a70 = s70.toInt(&ok); //不指定第二个参数默认转换为10进制
  154. if(ok)
  155. {
  156. qDebug()<<"s70 = hello qt :"<<"转换成功,数据是:"<<a70;
  157. }
  158. else
  159. {
  160. qDebug()<<"s70 = hello qt :"<<"转换失败!"; //数据转换失败
  161. }
  162.  
  163. //数字转换为字符串
  164. qDebug()<<"--------------数字转换为字符串--------------";
  165. int b = 100;
  166. QString s80 = QString("%1").arg(b);
  167. qDebug() <<"s80="<<s80; //s80= "100"
  168.  
  169. b = 200;
  170. s80 = QString::number(b);
  171. qDebug() <<"s80="<<s80; //s80= "200"
  172.  
  173. double d = 0.852;
  174. s80 = QString::number(d);
  175. qDebug() <<"s80="<<s80; //s80= "0.852"
  176.  
  177. //QString 转C++ string:
  178. QString q_str1 = "hello";
  179. std::string c_str1 = q_str1.toStdString();
  180. std::cout<<"QString 转C++ string="<<c_str1<<std::endl;
  181.  
  182. //C++ string 转QString:
  183. std::string c_str2 = "world";
  184.  
  185. QString q_str2 = QString::fromStdString(c_str2);
  186. qDebug()<<"C++ string 转QString="<<q_str2;
  187.  
  188. qDebug()<<"--------------NULL字符串和空字符串的区别--------------";
  189. QString s81 = QString();
  190. qDebug()<<s81.isNull(); //true
  191. qDebug()<<s81.isEmpty(); //true
  192. QString s82 = QString("");
  193. qDebug()<<s82.isNull(); //false
  194. qDebug()<<s82.isEmpty(); //true
  195.  
  196. qDebug()<<"以下代码和上面等价:";
  197. qDebug()<<QString().isNull(); //true
  198. qDebug()<<QString().isEmpty(); //true
  199. qDebug()<<QString("").isNull(); //false
  200. qDebug()<<QString("").isEmpty(); //true
  201.  
  202.  
  203. }
  204.  
  205. Widget::~Widget()
  206. {
  207.  
  208. }
---------②运行结果
  1. --------------运算符重载,拼接字符串--------------
  2. QString 杞珻++ string=hello    //标准c++的字符串在qt中的编码问题导致乱码
  3. s3= "hello qt"
  4. s3= "hello qt!"
  5. s4= "hello world!"
  6. --------------sprintf方式实现:很少用--------------
  7. s10= "Welcom1e"
  8. s10= "to you!"
  9. s10= "Welcome to you!"
  10. --------------组包:QString::arg()--------------
  11. s21= "www.yongheng0852.com"
  12. s22= "www.yongheng0852.com"
  13. --------------其他组合字符串的方式--------------
  14. s30= "yongheng0852.com"
  15. s30= "www.yongheng0852.com"
  16. --------------replace()字符串替换--------------
  17. s30= "http://www.yongheng0852.com"
  18. --------------trimmed()移除两端的空白字符--------------
  19. s40= " www.\tyongheng0852.\ncom "
  20. s40= "www.\tyongheng0852.\ncom"
  21. s41= " hello\nworld\t! "
  22. s41= "hello world !"
  23. --------------以某个字符串开头或结尾:s50--------------
  24. true
  25. false
  26. false
  27. true
  28. true
  29. 判断是否包含某个字符串:s50
  30. false
  31. true
  32. --------------比较字符串大小:s60--------------
  33. false
  34. false
  35. false
  36. true
  37. true
  38. true
  39. ret= 1
  40. ret= 0
  41. ret= -1
  42. ret= 0
  43. ret= 32
  44. ret= 32
  45. ret= 0
  46. --------------字符串->数据(int等)--------------
  47. a70= 168
  48. a71= 0.168
  49. a70= 0
  50. s70 = 0168: 16进制转换10进制成功,数据是: 360
  51. s70 = 0167: 8进制转换10进制成功,数据是: 119
  52. s70 = hello qt : 转换失败!
  53. --------------数字转换为字符串--------------
  54. s80= "100"
  55. s80= "200"
  56. s80= "0.852"
  57. C++ string QString= "world"
  58. --------------NULL字符串和空字符串的区别--------------
  59. true
  60. true
  61. false
  62. true
  63. 以下代码和上面等价: true
  64. true
  65. false
  66. true
---------③注意事项,虽然字符串有NULL和Empyt,但是  QString A();   cout<<A.isNull();  这种定义方式是编译不同过的(面试题)。
---------④完整的代码(注意解压后不能有中文路径)5_1_1_Qt字符串类QString的基本使用.zip(见个人博客)
            

3.WHY

------1)主要的原因,在 Qt中使用了标准c++的string类时,由于编码问题,很多中文的字符串,在qt中显示出来的都是乱码,使用QTstring,处理编码问题很方便。