Qt 5.12实战
上QQ阅读APP看书,第一时间看更新

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"]