QStringList

1.概要

2.内容

QStringList 是 Qt 框架中的一个类,它提供了对字符串列表的处理功能。这个类继承自 QList<QString>,因此它具有 QList 的所有功能,但专门用于处理 QString(Qt 的字符串类)对象。使用 QStringList 可以更方便地处理字符串列表,如排序、过滤和遍历等。

以下是一些关于 QStringList 的常用方法和示例:

创建 QStringList

可以通过多种方式创建 QStringList

// 使用默认构造函数  
QStringList list;  
  
// 使用另一个 QStringList 初始化  
QStringList list2(list);  
  
// 使用 QString 初始化(单个字符串)  
QStringList list3("singleString");  
  
// 使用字符串和分隔符初始化  
QStringList list4 = QStringList() << "one" << "two" << "three";  
// 或  
QStringList list5;  
list5 << "one" << "two" << "three";  
  
// 从现有的 QList<QString> 转换  
QList<QString> qList;  
qList << "four" << "five" << "six";  
QStringList list6(qList);

常用方法

  • append(): 添加一个字符串到列表的末尾。

    list.append("newString");
  • join(): 将字符串列表连接成一个字符串,使用指定的分隔符。

    QString joinedString = list.join(", ");
  • split(): 与 join() 相反,将一个字符串按照指定的分隔符分割成字符串列表。这是 QString 的方法,但结果可以赋值给 QStringList

    QStringList list = QString("apple,banana,cherry").split(",");
  • sort(): 对字符串列表进行排序。

    list.sort();
  • filter(): 使用正则表达式或简单的字符串匹配来过滤列表。

    QStringList filteredList = list.filter("ba*"); // 使用简单的通配符匹配
  • contains(): 检查列表是否包含特定的字符串。

    bool hasBanana = list.contains("banana");
  • replaceInStrings(): 在列表中的每个字符串中替换子字符串。

    list.replaceInStrings("ap", "or"); // 将每个字符串中的 "ap" 替换为 "or"
  • removeAll(): 移除列表中所有与指定字符串匹配的项。

    list.removeAll("apple");
  • at(): 返回指定索引位置的字符串(与 operator[] 类似,但提供边界检查)。

    QString firstItem = list.at(0);
  • value(): 与 at() 类似,但如果索引超出范围,可以返回一个默认值。

    QString item = list.value(10, "default"); // 如果索引 10 超出范围,返回 "default"

示例

以下是一个简单的示例,展示了如何使用 QStringList

#include <QStringList>  
#include <QDebug>  
  
int main() {  
    // 创建 QStringList  
    QStringList fruits;  
    fruits << "Apple" << "Banana" << "Cherry" << "Date";  
  
    // 打印原始列表  
    qDebug() << "Original list:" << fruits;  
  
    // 排序列表  
    fruits.sort();  
    qDebug() << "Sorted list:" << fruits;  
  
    // 检查是否包含某个字符串  
    if (fruits.contains("Banana")) {  
        qDebug() << "The list contains Banana.";  
    }  
  
    // 过滤列表  
    QStringList filteredFruits = fruits.filter("B*");  
    qDebug() << "Filtered list (starts with B):" << filteredFruits;  
  
    // 连接字符串  
    QString joinedFruits = fruits.join(", ");  
    qDebug() << "Joined string:" << joinedFruits;  
  
    return 0;  
}

这个示例演示了如何创建、排序、检查、过滤和连接字符串列表。QStringList 是处理字符串列表时非常有用的工具,特别是在需要执行这些常见操作时。

2.接口

QStringList 是 Qt 框架中专门用于处理字符串列表的类,它继承自 QList<QString> 并提供了许多针对字符串列表的便捷方法。以下是一些 QStringList 的常用接口(方法):

构造和初始化

  • QStringList(): 构造一个空的字符串列表。
  • QStringList(const QString &str): 构造一个只包含一个字符串的列表。
  • QStringList(const QStringList &other): 使用另一个 QStringList 来初始化新的列表。
  • operator<< (const QString &str): 向列表中添加一个字符串,通常用于初始化或追加元素。

添加和移除元素

  • append(const QString &str): 在列表的末尾添加一个字符串。
  • prepend(const QString &str): 在列表的开头添加一个字符串。
  • removeAll(const QString &str): 移除列表中所有与指定字符串相等的元素。
  • removeAt(int index): 移除指定索引位置的元素。
  • removeFirst(): 移除列表中的第一个元素。
  • removeLast(): 移除列表中的最后一个元素。
  • removeDuplicates(): 移除列表中的重复元素。

访问元素

  • at(int index) const: 返回指定索引位置的字符串(带边界检查)。
  • operator[] (int index) const: 返回指定索引位置的字符串(不带边界检查,更快)。
  • first() const: 返回列表中的第一个字符串。
  • last() const: 返回列表中的最后一个字符串。
  • value(int index, const QString &defaultValue = QString()) const: 返回指定索引位置的字符串,如果索引超出范围则返回默认值。

修改元素

  • replace(int index, const QString &str): 替换指定索引位置的字符串。
  • replaceInStrings(const QString &before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive): 在列表中的每个字符串中替换子字符串。

查询和排序

  • contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const: 检查列表中是否包含指定的字符串。
  • count(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const: 返回列表中指定字符串出现的次数。
  • indexOf(const QString &str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const: 返回列表中第一次出现指定字符串的索引位置。
  • lastIndexOf(const QString &str, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const: 返回列表中最后一次出现指定字符串的索引位置。
  • isEmpty() const: 检查列表是否为空。
  • size() const / count() const: 返回列表中的元素个数。
  • sort(Qt::SortOrder order = Qt::AscendingOrder): 对列表进行排序。

遍历元素

  • 可以使用标准的 C++ 循环(如 forwhile)结合索引访问或迭代器来遍历 QStringList
  • const_iterator: 用于遍历列表的常量迭代器类型。
  • begin() const: 返回指向列表开头的常量迭代器。
  • end() const: 返回指向列表末尾之后的常量迭代器。

转换和其他操作

  • join(const QString &separator) const: 将列表中的字符串连接成一个字符串,使用指定的分隔符。
  • split(const QString &sep, Qt::SplitBehavior behavior = Qt::KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive) static: 将一个字符串按照指定的分隔符分割成字符串列表(静态方法)。
  • filter(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const: 返回一个新的 QStringList,其中包含所有与指定字符串匹配的元素(可以使用通配符或正则表达式)。
  • toUtf8() const: 返回列表中所有字符串的 UTF-8 编码版本(组合成一个 QByteArray)。
  • fromUtf8(const QByteArray &byteArray): 从 UTF-8 编码的 QByteArray 创建一个 QStringList(静态方法)。

请注意,这里列出的只是 QStringList 的一些常用接口,并不是全部。Qt 文档提供了完整的接口列表和详细说明,建议在使用时参考官方文档。

3.遍历

QStringList 在 Qt 框架中作为处理字符串列表的专用类,提供了多种遍历其元素的方法。以下是一些遍历 QStringList 的常用方式:

1. 使用索引访问

你可以通过索引来访问 QStringList 中的每个元素,这种方式类似于访问数组。

QStringList list;  
list << "Apple" << "Banana" << "Cherry";  
  
for (int i = 0; i < list.size(); ++i) {  
    qDebug() << list.at(i);  
}

或者,使用 operator[] 进行更快速的访问(但不带边界检查):

for (QStringList::const_iterator it = list.begin(); it != list.end(); ++it) {  
    qDebug() << *it;  
}

2. 使用迭代器

QStringList 提供了迭代器,允许你以 STL 风格的方式遍历列表。

for (QStringList::const_iterator it = list.begin(); it != list.end(); ++it) {  
    qDebug() << *it;  
}

对于 Qt5 及更高版本,你还可以使用范围循环(range-based for loop),这使得代码更加简洁:

foreach (const QString &str, list) {  
    qDebug() << str;  
}

3. 使用 foreach 宏(不推荐)

在较早的 Qt 版本中,foreach 宏被用来遍历容器。然而,从 Qt5.7 开始,foreach 已被标记为过时,并建议使用范围循环代替。不过,如果你仍然在使用较旧的 Qt 版本,可以这样使用 foreach

foreach (const QString &str, list) {  
    qDebug() << str;  
}

请注意,foreach 宏在 Qt6 中已被移除,因此建议更新你的代码以使用范围循环或其他现代遍历方法。

4. 使用 Java 风格的迭代器(不推荐)

虽然 Qt 提供了类似 Java 的迭代器接口,但这种方式在 Qt 中并不常用,且通常不如 STL 风格的迭代器或范围循环简洁。不过,如果你更喜欢这种风格,可以这样做:

QListIterator<QString> it(list);  
while (it.hasNext()) {  
    qDebug() << it.next();  
}

总的来说,推荐使用范围循环或 STL 风格的迭代器来遍历 QStringList,因为它们提供了更简洁、更现代的代码风格。同时,请注意避免使用过时的 foreach 宏,并确保你的代码与当前的 Qt 版本兼容。

3.关联链接

4.关联知识

1.QStringList

QStringList 是 Qt 框架中用于处理字符串列表的一个非常实用的类。它继承自 QList<QString>,因此具有 QList 的所有功能,并针对字符串列表进行了优化,提供了一系列便捷的方法,使处理字符串列表变得更加简单和直观。

一、QStringList 的特点

  • 隐式共享:和 QString 一样,QStringList 也是隐式共享的。将它们作为值参数传递既快速又安全。
  • 字符串列表处理:专门用于存储和操作一系列的 QString 对象,适用于需要处理一系列字符串的场合,如读取文件列表、存储用户输入等。

二、构造函数

  • 默认构造函数QStringList(),创建一个空的字符串列表。
  • 拷贝构造函数QStringList(const QStringList &other),根据另一个字符串列表创建一个副本。
  • 其他构造函数
    • QStringList(const QString &str),构造一个包含单个字符串的字符串列表。
    • QStringList(const QList<QString> &other),根据一个 QList<QString> 列表创建一个 QStringList
    • QStringList(std::initializer_list<QString> args),使用初始化列表创建一个字符串列表。

三、常用成员函数

  1. 添加和删除元素
    • append(const QString &str):在列表末尾添加一个字符串。
    • prepend(const QString &str):在列表开头添加一个字符串。
    • insert(int index, const QString &str):在指定位置插入一个字符串。
    • removeAt(int i):移除指定位置的字符串。
    • removeAll(const QString &str):移除字符串列表中所有匹配的字符串。
    • clear():清空列表。
  2. 访问元素
    • at(int i):返回指定位置的字符串,如果索引越界会抛出异常。
    • operator[](int i):返回指定位置的字符串,不进行边界检查。
    • first():返回第一个字符串,如果列表为空则返回空字符串。
    • last():返回最后一个字符串,如果列表为空则返回空字符串。
    • value(int index):返回指定位置的字符串,如果索引越界会返回一个空字符串。
  3. 查找元素
    • indexOf(const QString &str, int from = 0):返回指定字符串在列表中的索引位置,从指定位置开始搜索。
    • lastIndexOf(const QString &str, int from = -1):返回指定字符串在列表中最后一次出现的索引位置。
    • contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive):判断列表是否包含指定字符串,可以指定是否区分大小写。
  4. 修改元素
    • replaceInStrings(const QString &before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive):在字符串列表中的每个字符串中替换指定的子字符串。
  5. 排序和去重
    • sort(Qt::CaseSensitivity cs = Qt::CaseSensitive):对字符串列表进行排序,可以指定是否区分大小写。
    • removeDuplicates():从列表中删除重复的条目,条目不必排序,删除后仍旧保持原来的顺序。
  6. 连接和拆分
    • join(const QString &separator):使用指定的分隔符将列表中的字符串连接起来并返回连接后的字符串。
    • split(const QString &sep, const QString &str, bool allowEmptyEntries = false):使用指定的分隔符将字符串拆分成字符串列表。

四、示例代码

以下是一个使用 QStringList 的简单示例:


#include <QStringList>
#include <QDebug>

int main() {
    QStringList list;

    // 添加字符串
    list.append("Apple");
    list.prepend("Orange");
    list.insert(1, "Banana");

    // 打印字符串列表
    qDebug() << "Initial list:" << list;

    // 移除字符串
    list.removeAt(2); // 移除索引2的字符串(即"Banana")
    list.removeAll("Orange"); // 移除所有"Orange"字符串

    // 打印移除后的字符串列表
    qDebug() << "After removal:" << list;

    // 查找字符串索引
    int index = list.indexOf("Apple");
    qDebug() << "Index of 'Apple':" << index;

    // 替换字符串列表中的字符串
    list.replaceInStrings("Apple", "Pear");
    qDebug() << "After replacement:" << list;

    // 对字符串列表进行排序
    list.sort();
    qDebug() << "Sorted list:" << list;

    // 使用分隔符连接字符串列表
    QString joinedStr = list.join(", ");
    qDebug() << "Joined string:" << joinedStr;

    // 访问字符串列表中的元素
    QString firstItem = list.at(0);
    qDebug() << "First item:" << firstItem;

    return 0;
}

五、总结

QStringList 是 Qt 框架中用于处理字符串列表的强大工具,提供了丰富的函数来操作和管理字符串集合。通过合理使用这些函数,可以方便地对字符串列表进行各种操作,提高开发效率。

2.QStringList 遍历 

在 Qt 中,遍历 QStringList 可以通过多种方式实现,包括使用传统的 for 循环、范围 for 循环(也称为基于范围的 for 循环),以及迭代器。以下是这些方法的示例:

1. 使用传统 for 循环

传统的 for 循环允许你通过索引访问每个元素。


#include <QStringList>
#include <QDebug>

int main() {
    QStringList list = {"Apple", "Banana", "Cherry"};

    for (int i = 0; i < list.size(); ++i) {
        qDebug() << list[i];
    }

    return 0;
}

2. 使用范围 for 循环

范围 for 循环更简洁,适合遍历整个列表。


#include <QStringList>
#include <QDebug>

int main() {
    QStringList list = {"Apple", "Banana", "Cherry"};

    for (const QString &item : list) {
        qDebug() << item;
    }

    return 0;
}

3. 使用迭代器

使用迭代器可以在遍历过程中进行更复杂的操作,如删除元素。


#include <QStringList>
#include <QDebug>

int main() {
    QStringList list = {"Apple", "Banana", "Cherry"};

    for (QStringList::iterator it = list.begin(); it != list.end(); ++it) {
        qDebug() << *it;
    }

    return 0;
}

4. 使用常量迭代器

如果你不需要修改列表中的元素,使用常量迭代器是一个好选择。


#include <QStringList>
#include <QDebug>

int main() {
    QStringList list = {"Apple", "Banana", "Cherry"};

    for (QStringList::const_iterator it = list.cbegin(); it != list.cend(); ++it) {
        qDebug() << *it;
    }

    return 0;
}

5. 使用 std::for_each 和 Lambda 表达式

如果你熟悉 C++ 标准库算法,可以使用 std::for_each 和 Lambda 表达式。


#include <QStringList>
#include <QDebug>
#include <algorithm>

int main() {
    QStringList list = {"Apple", "Banana", "Cherry"};

    std::for_each(list.begin(), list.end(), [](const QString &item) {
        qDebug() << item;
    });

    return 0;
}

总结

选择哪种遍历方式取决于你的具体需求。对于简单的遍历,范围 for 循环通常是最简洁和易读的。如果你需要在遍历过程中修改列表或进行更复杂的操作,迭代器可能会更合适。

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值