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