QString完整详解

📅 2026/7/10 22:40:40 👁️ 阅读次数 📝 编程学习
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.2QStringLiteral("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上下文传参。