3.6 字符串列表类QStringList
字符串列表类QStringList是从QList <QString>继承而来的,是一个非常有用的类。在处理多个字符串时使用QStringList类有时能事半功倍。
QStringList类可以使用QList类的所有函数(或称为方法),如append()、prepend()、insert()、replace()、removeAll()、removeAt()、removeFirst()、removeLast()和removeOne()。
1. QStringList类对象的初始化
初始化就是把QString字符串添加到QStringList类对象中,一般使用操作符<<。比如:
QStringList qstrList; qstrList<<"Android" << "Qt Creator" << "Java" << "C++";
2. 增加字符串
QStringList类对象可以通过函数append()或使用查找法<<来添加QString字符串,比如:
QStringList qstrList; qstrList.append("python"); qstrList << "PHP" ;
3. 遍历QStringList类对象中的元素
可以使用QStringList类的父类QList类的成员函数at()来遍历QStringList类对象中的元素,该函数的原型声明如下:
const T &QList::at(int i);
其中,i表示第i个元素,索引值从0开始。
【例3.5】 遍历QStringList类对象中的元素
(1)启动Qt Creator 4.8.2,新建一个控制台项目,项目名为test。
(2)在test.cpp中输入如下代码:
其中,QStringLiteral是Qt 5中新引入的一个用来从“字符串常量”创建QString类对象的宏。
(3)按Ctrl+F5快捷键运行这个项目,结果如图3-5所示。
图3-5
4. 在某位置插入字符串
QStringList类的父类QList类的成员函数insert()可以将字符串插入到QStringList类对象中指定的位置。比如:
QStringList list; list << "alpha" << "beta" << "delta"; //执行后,列表中的内容为["alpha", "beta", "gamma", "delta"] list.insert(2, "gamma");
第一个参数为我们要插入字符串的位置,后面的参数为要插入的字符串。
除了插入操作,QList类的其他一些方法也都可以使用,比如替换、移除等,具体可以参考QList类中的介绍。下面我们看一下QStringList类自身的成员函数。
5. 合并列表中的字符串为一个字符串
可以调用成员函数join()将QStringList类对象中的所有字符串合并为一个字符串。该函数有几个原型声明形式:
QString QStringList::join(const QString &separator); QString QStringList::join(QLatin1String separator); QString QStringList::join(QChar separator);
其中,separator是每两个字符串之间的分隔符字符串;QChar是每两个字符串之间的分隔符字符。上述函数会返回合并后的字符串。比如:
QStringList qstrList; qstrList<<"Android" << "Qt Creator" << "Java" << "C++"; // qstrList: ["Android ", " Qt Creator ", " Java ", " C++"] QString str = fonts.join(","); //str == "Android,Qt Creator,Java,C++"
6. 拆分字符串
可以调用QString类的成员函数split()将QString字符串拆分为多个QStringList元素。该函数的原型声明如下:
QStringList QString::split(const QString &sep, QString::SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive);
其中,参数sep是分隔符;KeepEmptyParts表示是否忽略空串;Qt::CaseSensitive表示要区分字母大小写。该函数返回的是分割后的QStringList类对象。比如:
str == "Arial, Helvetica, Times, Courier"; QStringList list; list = str.split(','); // list: ["Arial", "Helvetica", "Times", "Courier"]
又比如:
QString str = "Android,Qt Creator, ,Java,C++"; QStringList list1 = str.split(","); // list1: [ "Android", "Qt Creator"," ", "Java", "C++" ] QStringList list2 = str.split(",", QString::SkipEmptyParts); // list2:[ "Android", "Qt Creator", "Java", "C++" ]
再比如:
QString str = "a,,b,c"; QStringList list1 = str.split(','); // list1: [ "a", "", "b", "c" ] QStringList list2 = str.split(',', QString::SkipEmptyParts); // list2: [ "a", "b", "c" ]
可以看出,如果有QString::SkipEmptyParts,空项就不会出现在结果中。默认情况下,空项会被保留。
7. 索引位置
成员函数IndexOf()返回指定字符串第一个出现的索引位置。成员函数lastIndexOf()返回字符串最后一次出现的索引位置。比如:
QStringList qstrList; qstrList<<"Java" << "Android" << "Qt Creator" << "Java" << "C++"; int index = qstrList.indexOf("Java");//返回 0 int index = qstrList.indexOf("Java");//返回 3
8. 替换
QStringList类的成员函数replaceInStrings()用来把字符串列表每个元素中的某些字符串替换为新的字符串,该函数的原型声明如下:
QStringList & replaceInStrings(const QString &before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
其中,参数before是要准备替换掉的源字符串;after是准备用于替换的字符串;Qt::CaseSensitive表示匹配时要区分字母大小写。比如:
QStringList list; list << "alpha" << "beta" << "gamma" << "epsilon"; list.replaceInStrings("a", "o"); // list == ["olpho", "beto", "gommo", "epsilon"]
又比如:
QStringList files; files << "$file/src/moc/moc.y" << "$file/src/moc/moc.l" << "$file/include/qconfig.h"; files.replaceInStrings("$file", "/usr/file"); // files: [ "/usr/file/src/moc/moc.y", ...]
9. 过滤
QstringList类的成员函数filter()用于提取一个新的列表,该列表每个元素(字符串)必须包含某个特定的字符串。该函数的原型声明如下:
QStringList filter(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive);
其中,参数str表示要包含在内的字符串;Qt::CaseSensitive表示匹配时要区分字母大小写,而Qt::CaseInSensitive表示不区分字母大小写。该函数会返回新的QStringList类对象。比如:
QStringList list; list << "Bill Murray" << "John Doe" << "Bill Clinton"; QStringList result; result = list.filter("Bill"); // result: ["Bill Murray", "Bill Clinton"] result = list.filter("bill",Qt::CaseInSensitive); // result: ["Bill Murray", "Bill Clinton"]