Qt中的字符串操作
3.1 概述
对于一个应用程序来说,文本操作几乎是无处不在的,无论是窗体应用还是控制台应用都难免要做诸如显示,输入,处理文本之类的操作。因此字符串作为文本的载体也就必不可少,大多数编程语言都直接或者间接的提供了字符串类型以方便我们操作字符串,比如C++标准库提供的字符串类std::string。Qt作为一个跨平台开发框架实现了自己的字符串类型QString,该类型广泛应用于Qt应用程序中,也是各种Qt图形用户控件的基础。鉴于上面这些考虑以及自己学习中遇到的麻烦,决定先从QString来入手各种组件的学习。
3.2 通过QDebug输出调试信息
在正式接触QString之前我们先来看一下在Qt中如何向控制台输出信息,假设要向控制台输出Hello,World!,在C++学习中我们最常用的做法就是:
//直接输出string literals
std::cout<<"Hello,World!"<<std::endl;
//输出String类的对象
std::string str("Hello,String!");
std::cout<<str<<std::endl;
在Qt应用程序开发中当然也可以这样做,能否成功使用std::cout来输出这些字符串依赖于输出操作符能否正确的识别作为右操作数的字符串,在C++中这些操作已经通过**重载输出操作符<<**来完成了。而在Qt中因为其内部控件大量使用QString类型,这种类型不能被输出操作符识别,因此这样的方法也就不可行:
QString str("Hello,QString!");
std::cout<<str<<std<<endl; //会报错,输出操作符不认识QString类型
为了完成这些Qt内置数据类型的正确输出,在Qt中我们通常使用qDebug()(严格来说这不是函数,而是一个定义在头文件QtGlobal中的宏),他有下面两种常见的用法,第一种方法中qDebug()就类似与C语言的库函数printf(),对于控制台应用程序该函数会把参数输出到控制台:
qDebug("Items in list: %d", myList.size());
另一种用法更加简洁,如同C++操作输出流的方法,这种方法需要包含头文件QDebug才能正常使用(因为该方法中会用到QDebug对象):
#include <QDebug>
#include <QString>
QString qStr("Hello,QString!");
qDebug()<<qStr;//使用qDebug输出结尾默认已经换行,用不着endl
注意两点:
- 上面提到qDebug宏在头文件QtGlobal中定义,不过由于该头文件在大多数其他头文件中已经被包含,所以不用手动再次包含。比如在Qt主程序中默认包含的QCoreApplication文件中就有QtGlobal。
- 在引入QDebug头文件后,qDebug宏会返回一个QDebug类的实例。
- 如果定义了宏QT_NO_DEBUG_OUTPUT,则qDebug会失效。
3.3 QString对象的构造和访问
知道了如何对QString进行输出之后,就可以进一步来看QString类的用法了,首先先了解一下QString是什么,阅读官方文档之后大概可以摘出来下面几点:
- QString是由QChars构成的序列,而QChars支持UNICODE编码
- QString支持std::string和std::wstring的相互转换
- QString底层实现采用 implicit sharing (copy-on-write) 技术来减少内存开支和不必要的数据拷贝。
- 跨各种平台,由Qt保证。
然后我们注意考察QString的常见用法,首先是创建字符串,最简单地,我们可以*通过一个C风格字符串(const char )来初始化一个QString:
QString str = "Hello,World!";
也可以通过QChars数组的方式来构造一个字符串,此时必须指定字符数组大小,否则会一直找到’\0’才停止:
const QChar data[5] = {
'H','e','l','l','o'};
QString str(data,5);
const QChar data1[6] = {
'H','e','l','l','o','\0'};
QString str(data1);
还有一种方法是通过resize()调整QString的大小,然后为每一个元素逐一赋值,而字符串的访问有两种方法,对于普通字符串可以直接使用运算符[],得到一个可以用作赋值运算左值的字符引用:
QString str;
str.resize(4);
str[0] = QChar('U');
str[1] = QChar('n');
str[2] = QChar(0x10e3);
str[<