Qt--QString

本文详细介绍了Qt中的QString类,包括其Unicode字符存储、隐式共享特性以及丰富的操作函数,如组合、查询、比较、替代、截取和删除等。此外,还讨论了QString与其他数据类型的转换,如与数值类型、QByteArray和char*的相互转换。

一、Qt字符串类–QString

QString类是Qt提供的功能十分强大的字符串类,由QtCore共享库实现。标准C++提供了两种字符串:C语言风格的以“\0”字符结尾的字符数组和字符串类String。而QString类提供了了一种Unicode字符串类。QString类内部存储了16bit的QChar字符,每个QChar字符代表一个Unicode4.0字符。Unicode字符集是ASCII和Latin-1字符集的超集,能够表示世界上绝大多数书写系统中的字符。QString类采用隐式共享(implict sharing)来减少对内存的使用和避免没必要的数据复制操作,同时,QString变量中不仅可以包含“\0”,而且我们也不必担心字符串数组要以“\0”结尾,这些QString类都帮我们处理好了。QString类还提供了丰富的操作函数,可以非常方便地进行字符串操作和QString类与其他数据类型的转换。

二、QString初始化

Qt官方文档给出了QString变量5种初始化的方式,下面举例3种常用的方式。

    QString str1 = "Hello World!";

    static const QChar str_data[] = {
  
  'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'};
    QString str2(str_data, 12);   // QString str2(str_data, sizeof(str_data)/2);

    QString str3;
    str3.resize(12);
    str3[0] = QChar('H');
    str3[1] = QChar('e');
    str3[2] = QChar('l');
    str3[3] = QChar('l');
    str3[4] = QChar('o');
    str3[5] = QChar(' ');
    str3[6] = QChar('W');
    str3[7] = QChar('o');
    str3[8] = QChar('r');
    str3[9] = QChar('l');
    str3[10] = QChar('d');
    str3[11] = QChar('!');

    qDebug() << str1 << str2 << str3;

Qchar类中没有获得其数组长度的成员函数,但是由于QChar为16bit的Unicode字符,所以可以通过sizeof()/2来获取QChar数组的长度。

三、QString操作

1 组合

QString类提供了很多种组合字符串的方法如下:

(1) “+”和“+=”操作符重载

    QString str1 = "Hello ";
    QString str2 = "World!";
    QString str3 = str1 + str2;
    QString str3 = str1 + "World!";
    QString str1 += "World!";

需要注意的是,使用”+”和”+=”进行QString连接时,操作数必须至少有一个是QString类,否则无法重载操作符。

(2) append(), prepend(), insert()函数

    QString str1 = "Hello ";
    QString str2 = "World!";
    str1.append("World!");     // 在字符串str1最后插入字符串"World!"
    str2.prepend("Hello ");    // 在字符串str2最前面插入字符串"Hello "
    QString str3 = "World!";   
    str3.insert(0, str2);      // 在字符串str3位置0处插入字符串str2

(3) sprintf()函数

    QString str1, str2;
    str1.sprintf("%s", "Hello ");                // str1 = "Hello "
Qt 的 `QString` 类中,并没有直接提供类似 C 标准库中的 `sprintf()` 成员函数。因此,如果尝试使用 `QString::sprintf` 会引发编译错误。为实现类似功能,Qt 提供了替代方法,例如通过 `QString::asprintf()` 或者结合 `QTextStream` 实现格式化字符串输出。 ### 使用 `QString::asprintf()` `QString::asprintf()` 是一个静态函数,其行为与 C 标准库的 `sprintf()` 类似,但返回的是格式化后的 `QString` 对象。此方法支持大多数标准格式说明符。 ```cpp #include <QString> #include <QDebug> int main() { int value = 42; QString str = QString::asprintf("The value is: %d", value); qDebug() << str; // 输出:The value is: 42 } ``` 需要注意的是,`QString::asprintf()` 并不支持所有平台上的浮点数格式化(如 `%f`),这取决于底层 C 库的支持情况 [^1]。 ### 使用 `QTextStream` 进行格式化 另一种更安全且跨平台兼容的方式是使用 `QTextStream` 来构造字符串。这种方式提供了类型安全和良好的可读性。 ```cpp #include <QString> #include <QTextStream> #include <QDebug> int main() { int value = 42; double pi = 3.14159; QString str; QTextStream out(&str); out << "Value: " << value << ", Pi: " << pi; qDebug() << str; // 输出:Value: 42, Pi: 3.14159 } ``` ### 使用 `QString::arg()` 方法 `QString::arg()` 是一种更推荐的方法来格式化字符串,它支持多个参数,并且具有更好的类型安全性。 ```cpp #include <QString> #include <QDebug> int main() { int value = 42; double pi = 3.14159; QString str = QString("Value: %1, Pi: %2").arg(value).arg(pi); qDebug() << str; // 输出:Value: 42, Pi: 3.14159 } ``` 这些方法都可以用来替代 `sprintf()`,从而避免调用不存在的成员函数导致的编译错误。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值