QString完整详解

1. 基础定位

QString是Qt专门处理Unicode字符串的类,所有界面、文件路径、网址、命令行、QML交互全部依赖它; C++原生std::string仅字节流、const char*纯ASCII,多语言、中文、特殊网址极易乱码,Qt工程统一用QString。

编码底层:

内部存储UTF-16(QChar),天然支持中文、日文、emoji、特殊域名,不用手动转码。

2. 3种字符串字面量写法

先前置依赖(Qt6):

复制代码
using namespace Qt::StringLiterals;

2.1 "xxx"_L1

编译期直接生成QString,无运行时转换开销

复制代码
QUrl::fromUserInput("about:blank"_L1);

engine.loadFromModule("Webview_Test01"_L1, "Main"_L1);

等价老式:QStringLiteral("about:blank")

2.2 QStringLiteral("xxx")

编译期静态字符串,性能最优,不堆内存分配

复制代码
QString url = QStringLiteral("https://qt.io");

2.3 普通"xxx"

是C风格字符串,传给QString参数会隐式转换,运行时分配内存、拷贝,频繁调用有性能损耗:

复制代码
// 不推荐

QString s = "test";

3. QString构造方式

复制代码
// 1. 字面量构造(最优)

QString s1 = "baidu.com"_L1;

// 2. 单个字符

QString s2(QChar('a'));

// 3. 重复字符

QString s3(10, ' '); // 10个空格

// 4. const char* 转换

QString s4("123456");

// 5. std::string 转 QString

std::string str = "test";

QString s5 = QString::fromStdString(str);

// 6. 数字转字符串

QString s6 = QString::number(1024);

QString s7 = QString::number(3.14);

4. 常用成员函数

4.1 判断空/有效

复制代码
QString text = "";

text.isEmpty();    // true,长度为0

text.isNull();     // true,未初始化空字符串

text.isBlank();    // true:全空格/制表符

样例Utils::fromUserInput里的判断:if (!userInput.isEmpty())

4.2 拼接字符串

复制代码
QString host = "https://";

QString domain = "qt.io";

QString url = host + domain;

// 格式化拼接(最常用,替代大量+号)

QString addr = QString("%1://%2").arg("https").arg("baidu.com");// %1 替换第一个arg,%2第二个

4.3 截取、分割、查找

Q

复制代码
String url = "https://doc.qt.io/qt-6/qstring.html";



url.startsWith("https");    // true

url.endsWith(".html");      // true

url.contains("qt.io");      // true

// 分割字符串,返回 QStringList

QStringList parts = url.split("/");

// 截取子串

url.mid(8);       // 从索引8到末尾

url.mid(8, 6);    // 从8开始,取6个字符

url.left(8);      // 左边8位

url.right(10);    // 右边10位

// 查找下标int idx = url.indexOf("qt.io");

4.4 去除空格

复制代码
QString input = "  https://baidu.com  ";

input.trimmed(); // 去除首尾空格

input.simplified(); // 首尾+中间连续空格合并为单个

4.5 大小写转换

复制代码
QString s = "QtWebView";

s.toLower(); // "qtwebview"

s.toUpper(); // "QTWEBVIEW"

4.6 类型互转

复制代码
// QString → 数字

QString numStr = "99";int num = numStr.toInt();double d = numStr.toDouble();

// QString → std::string

std::string stdStr = s.toStdString();

// QString → const char*(谨慎!仅临时用)

s.toLocal8Bit().constData();

5. 静态工具函数

QString::fromUserInput

· 智能解析用户输入网址:

· 输入qt.io自动补全https://qt.io

· 输入本地路径、IP、文件路径自动识别

非法输入返回无效QUrl

复制代码
QUrl Utils::fromUserInput(const QString &userInput){

    QUrl result = QUrl::fromUserInput(userInput);}

5.2 其他静态方法

复制代码
// 空字符串

QString::empty();

// 数字转字符串

QString::number(666);

// 字符重复

QString::repeated("-", 20);

6. 运算符重载

  • 字符串拼接

    QString a = "a"_L1 + "b"_L1;

== / != 直接对比内容(不用 strcmp)

复制代码
if (url == "about:blank"_L1)

按下标取字符

复制代码
QChar c = url[0];

7. QString和QUrl配合

复制代码
// 1. QString网址转QUrl

QString addr = "https://www.qt.io"_L1;

QUrl pageUrl(addr);

// 2. QUrl转回QString

QString showText = pageUrl.toString();

// 3. 空白页兜底

return QUrl::fromUserInput("about:blank"_L1);

8. QString与QLatin1String/QStringView补充

QLatin1String 老式拉丁单字节字符串,仅兼容旧代码,新项目不再使用,统一_L1。

QStringView(Qt5.15+/Qt6) 只读字符串视图,不拷贝内存,适合只读遍历,不修改场景,性能极高。

复制代码
QString s = "test"_L1;

QStringView v(s);

9. 常见坑 & 最佳实践

9.1 不要混用const char*大量拼接

复制代码
// 差:多次隐式转换

QString u = "https://" + "qt.io";

// 好:全部用 _L1

QString u = "https://"_L1 + "qt.io"_L1;

9.2 中文乱码问题

· Windows下直接字面量_L1不会乱码;

· 读取本地文件中文使用QFile + QTextStream指定编码,不要直接 toLocal8Bit。

9.3 判断空优先用isEmpty()

不要用s == "",isEmpty()效率更高。

9.4 函数参数尽量const QString &

传引用避免拷贝:

复制代码
// 推荐,无拷贝开销

void func(const QString &url);

// 不推荐,值传递会复制内存

void func(QString url);

10. 结合源码 样例 完整对照

复制代码
// 1. _L1 生成QString传给fromUserInput

const QString initialUrl = parser.positionalArguments().value(0, "https://www.qt.io"_L1);

// 2. 入参是 const QString &userInput

Q_INVOKABLE static QUrl fromUserInput(const QString &userInput);

// 3. 空值判断

if (!userInput.isEmpty())

// 4. 兜底空白页QString字面量

return QUrl::fromUserInput("about:blank"_L1);

整段WebView示例全部围绕QString做网址解析、命令行参数、QML上下文传参。

相关推荐
一粒代码6 天前
Android 混淆字典完全指南:R8 时代还能用吗?11 套字典实测对比
unicode
SunkingYang6 个月前
Qt中QString 查找子串的完整指南
qt·字符串·qstring·子字符串·查找子串
SunkingYang6 个月前
QT如何将char*转QString
qt·qstring·指针·转换·char
課代表7 个月前
PowerShell 字符转 UniCode 编码
字符编码·类型转换·unicode·powershell·批处理·转义·[char]
无心水7 个月前
【Python实战进阶】5、Python字符串终极指南:从基础到高性能处理的完整秘籍
开发语言·网络·python·字符串·unicode·python实战进阶·python工业化实战进阶
力江8 个月前
攻克维吾尔语识别的技术实践(多语言智能识别系统)
人工智能·python·自然语言处理·语音识别·unicode·维吾尔语
liulilittle1 年前
UTF-8 编解码可视化分析
c++·字符串·unicode·string·字符·char·utf8
imred1 年前
Unicode:如何让用户东方不败和[Family: Man, Woman, Girl, Boy]顺利通过用户名长度检查?
c++·unicode·utf8·icu
吴八月1 年前
字符集、编码的前世今生
utf-8·unicode·字符集编码