QString完整详解

发布时间:2026/7/10 22:22:26
QString完整详解 1.基础定位QString是Qt专门处理Unicode字符串的类所有界面、文件路径、网址、命令行、QML交互全部依赖它 C原生std::string仅字节流、const char*纯ASCII多语言、中文、特殊网址极易乱码Qt工程统一用QString。编码底层内部存储UTF-16QChar天然支持中文、日文、emoji、特殊域名不用手动转码。2. 3种字符串字面量写法先前置依赖Qt6using 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截取、分割、查找QString 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(); // QTWEBVIEW4.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、文件路径自动识别非法输入返回无效QUrlQUrl 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;/!直接对比内容不用 strcmpif (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。QStringViewQt5.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不会乱码· 读取本地文件中文使用QFileQTextStream指定编码不要直接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上下文传参。