简介

  • Qt 中常见的数据类型及其笔记

Qt QString 详解

QString 是 Qt 框架中用于表示和操作文本字符串的类。它是一个 Unicode 字符串类,能够很好地处理多语言字符集和复杂文本操作。QString 提供了丰富的功能用于创建、修改、查询和转换字符串。以下是 QString 的详细介绍,包括常用功能和示例代码。

1. QString 基本概念

QString 是一个 Unicode 字符串类,支持宽字符集。Qt 使用 UTF-16 编码存储字符串。相比 C++ 的 std::stringQString 更加适合处理包含多语言和特殊字符的文本。

2. QString 的构造方法

QString 提供了多种构造函数,可以从各种数据类型构建字符串。

1
2
3
4
5
QString str1;                        // 空字符串
QString str2("Hello, Qt!");           // 从字符串字面值创建
QString str3(QLatin1String("Hello")); // 从 QLatin1String 创建
QString str4(str2);                   // 拷贝构造函数
QString str5 = QString::number(42);   // 从数字创建

3. 常用方法

3.1. 字符串拼接

QString 提供了多种方式来拼接字符串。

  • 使用 + 运算符拼接:
    1
    2
    3
    
    QString str1 = "Hello";
    QString str2 = "World";
    QString result = str1 + " " + str2;  // "Hello World"
    
  • 使用 append() 方法拼接:
    1
    2
    
    QString str = "Hello";
    str.append(" World");  // "Hello World"
    

3.2. 字符串长度和访问

  • 获取字符串长度:
    1
    2
    
    QString str = "Hello";
    int length = str.length();  // 5
    
  • 访问单个字符:
    1
    
    QChar ch = str.at(1);  // 'e'
    

3.3. 查找和替换

QString 提供了多种查找和替换子字符串的函数:

  • 查找子字符串:
    1
    2
    
    QString str = "Hello, Qt!";
    int index = str.indexOf("Qt");  // 返回子字符串首次出现的索引,结果是 7
    
  • 替换子字符串:
    1
    2
    
    QString str = "Hello, World!";
    str.replace("World", "Qt");  // 结果是 "Hello, Qt!"
    

3.4. 大小写转换

  • 转换为大写或小写:
    1
    2
    3
    
    QString str = "Hello";
    QString upperStr = str.toUpper();  // "HELLO"
    QString lowerStr = str.toLower();  // "hello"
    

3.5. 截取字符串

  • 使用 mid() 截取部分字符串:
    1
    2
    
    QString str = "Hello, Qt!";
    QString substr = str.mid(7, 2);  // 结果是 "Qt"
    
  • 使用 left()right()
    1
    2
    
    QString leftStr = str.left(5);    // "Hello"
    QString rightStr = str.right(3);  // "Qt!"
    

3.6. 字符串分割

  • 使用 split() 按照分隔符拆分字符串:
    1
    2
    
    QString str = "apple,banana,grape";
    QStringList list = str.split(",");  // 拆分为 ["apple", "banana", "grape"]
    

3.7. 转换为其他数据类型

  • 转换为整数、浮点数等:
    1
    2
    3
    4
    5
    
    QString str = "123";
    int num = str.toInt();  // 123
    
    QString floatStr = "123.45";
    double num2 = floatStr.toDouble();  // 123.45
    
  • 转换为字节数组:
    1
    2
    
    QString str = "Hello";
    QByteArray byteArray = str.toUtf8();  // UTF-8 编码的字节数组
    

4. 静态方法

4.1. 创建字符串

  • 使用 QString::number() 方法从数值创建字符串:
    1
    2
    
    QString str = QString::number(42);      // "42"
    QString str2 = QString::number(3.1415); // "3.1415"
    
  • 使用 arg() 格式化字符串:
    1
    
    QString str = QString("The value is %1").arg(42);  // "The value is 42"
    

5. 比较字符串

  • 使用 compare() 方法比较两个字符串:
    1
    2
    3
    
    QString str1 = "apple";
    QString str2 = "orange";
    int result = QString::compare(str1, str2);  // < 0,因为 "apple" 在字典序中小于 "orange"
    
  • 也可以使用 ==!= 比较字符串:
    1
    2
    3
    
    if (str1 == str2) {
        // 字符串相等
    }
    

6. 字符串的编码处理

QString 内部使用 UTF-16 存储字符,但可以轻松转换为其他编码格式,例如 UTF-8、Latin1 等。

1
2
3
QString str = "你好,世界";
QByteArray utf8String = str.toUtf8();  // 转换为 UTF-8 字节数组
QByteArray latin1String = str.toLatin1();  // 转换为 Latin1 编码字节数组

7. 性能优化

QString 使用了引用计数(copy-on-write)的机制来优化性能,避免不必要的拷贝操作。当多个 QString 对象引用同一数据时,它们共享数据;只有当其中一个发生修改时,才会执行深拷贝。

8. 使用 QStringQByteArray 的转换

QByteArray 是字节数组类,而 QString 是 Unicode 字符串类,它们可以互相转换。

1
2
3
4
QString str = "Hello";
QByteArray byteArray = str.toUtf8();  // 将 QString 转换为 QByteArray

QString str2 = QString::fromUtf8(byteArray);  // 将 QByteArray 转换回 QString

9. 处理空字符串

  • isEmpty()isNull() 用于判断字符串是否为空或为 null
    1
    2
    3
    
    QString str;
    bool empty = str.isEmpty();  // true,因为是空字符串
    bool null = str.isNull();    // true,因为没有分配任何值
    

10. 总结

QString 是一个功能强大的类,能够处理各种复杂的字符串操作。它的 Unicode 支持使其在处理多语言字符时特别有效,且提供了高效的性能优化措施。

Qt QVector 详解

QVector 是 Qt 框架中用于存储相同类型元素的动态数组类,类似于 C++ 标准库的 std::vector。它提供了许多方便的接口来进行动态分配、访问和操作数据。下面是对 QVector 的详解。

1. 基本概念

QVector<T> 是一个模板类,T 是其中元素的类型。QVector 可以根据需要动态调整数组的大小,支持类似数组的下标访问方式,并且性能表现与 std::vector 类似。

1
QVector<int> intVector;  // 创建一个存储整数的 QVector

2. 常用操作

2.1 初始化

QVector 支持多种初始化方式,包括默认构造、指定大小的构造、和使用初始值的构造等。

1
2
3
QVector<int> vec1;  // 默认构造,空向量
QVector<int> vec2(5);  // 构造一个包含5个默认初始化元素的向量
QVector<int> vec3(5, 10);  // 构造一个包含5个元素,每个元素初始化为10

2.2 访问元素

可以通过下标访问或者使用 at() 函数。

1
2
int first = vec3[0];  // 使用下标访问
int second = vec3.at(1);  // 使用 at() 方法访问

2.3 添加元素

可以通过 append()push_back() 方法向向量末尾添加元素。insert() 方法可以在特定位置插入元素。

1
2
3
vec1.append(3);      // 向尾部添加元素
vec1.push_back(5);   // 与 append 类似,添加到末尾
vec1.insert(1, 4);   // 在索引 1 处插入元素

2.4 删除元素

可以使用 remove(), removeAt(), removeFirst(), removeLast() 等函数来删除元素。

1
2
3
vec1.removeAt(0);    // 删除索引为 0 的元素
vec1.removeFirst();  // 删除第一个元素
vec1.removeLast();   // 删除最后一个元素

2.5 查找和判断

QVector 提供 contains() 来判断是否包含某元素,indexOf()lastIndexOf() 用于查找某个元素的索引。

1
2
bool hasValue = vec1.contains(5);  // 判断是否包含 5
int index = vec1.indexOf(5);       // 查找 5 的位置

2.6 大小和容量

QVector 动态调整大小,可以通过 size() 获取当前元素的数量,通过 capacity() 获取预分配的内存容量。可以通过 resize() 改变 QVector 的大小。

1
2
3
int size = vec1.size();       // 获取当前元素数量
int capacity = vec1.capacity(); // 获取当前容量
vec1.resize(10);              // 改变大小为10,可能会填充新元素

3. 迭代

支持 C++ 范围循环(range-based for loop)和迭代器。

1
2
3
4
5
6
7
8
for (int value : vec1) {
    qDebug() << value;
}

QVector<int>::iterator it;
for (it = vec1.begin(); it != vec1.end(); ++it) {
    qDebug() << *it;
}

4. 性能

  • 内存管理QVector 会动态调整内存,避免频繁的内存分配。通常,capacity()size() 大,以减少内存重新分配的次数。
  • 浅拷贝优化(Copy-on-Write)QVector 使用 Qt 的隐式共享机制,也称为浅拷贝。当一个 QVector 被复制时,实际上并不会立即进行数据复制,直到修改操作发生,这提高了性能。

5. 与其他容器的互操作

QVector 提供了与其他容器(如 QList, QSet)的互操作能力,可以方便地将 QVector 转换为其他容器类型。

1
QList<int> list = vec1.toList();  // 将 QVector 转为 QList

6. 常用函数总结

  • append(T value) / push_back(T value):在末尾添加元素。
  • at(int i):返回指定索引处的元素。
  • size():返回当前元素数量。
  • capacity():返回当前预分配的内存大小。
  • clear():清空所有元素。
  • contains(T value):判断是否包含某个元素。
  • indexOf(T value):返回某个元素的索引。
  • removeAt(int i):删除指定位置的元素。
  • resize(int size):调整大小。

7. QVector 使用示例

下面是一个简单的示例,演示了 QVector 的基本用法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <QVector>
#include <QDebug>

int main() {
    QVector<int> vec;

    // 添加元素
    vec.append(1);
    vec.append(2);
    vec.append(3);

    // 访问元素
    qDebug() << "First element:" << vec.at(0);
    
    // 遍历元素
    for (int i = 0; i < vec.size(); ++i) {
        qDebug() << "Element at index" << i << ":" << vec[i];
    }

    // 查找和判断
    if (vec.contains(2)) {
        qDebug() << "Vector contains 2";
    }

    // 删除元素
    vec.removeAt(1);
    qDebug() << "After removing index 1:" << vec;

    return 0;
}

总结

QVector 是 Qt 提供的强大而灵活的动态数组容器,适用于需要高效存储和访问大量相同类型数据的场景。在日常使用中,可以充分利用其丰富的 API 和高性能特性来简化开发流程。