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上下文传参。