当前位置: 首页 > news >正文

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

http://www.jsqmd.com/news/1163575/

相关文章:

  • OpenAI 用 GPT-Live-1 全面升级 ChatGPT 语音模式,交互更自然还能实时翻译!
  • 2026年7月最新浪琴杭州东站万象汇维修保养服务电话 - 浪琴官方售后服务中心
  • 如何通过智能照明控制模块实现智慧城市照明管理?
  • Vitis IDE 导入 旧版SDK 工程步骤说明
  • 2026满屏文字粘贴后乱码,免费修复方法实测 - 软件工具教程方法
  • 老旧商用音视频矩阵长效运维案例解析:2005 年深圳 NEO 大厦设备 21 年稳定运行复盘 - 无缝混合矩阵厂家
  • 《C++反汇编与逆向分析技术揭秘》学习之第18章 反汇编代码的重建与编译
  • Linux 命令:wait —— 等待后台进程执行完毕
  • 6行代码搞wechatapi信机器人?老哥教你用iPad协议稳如狗
  • 暖风机性能如何?参数全解读
  • 【保定学院本科毕业论文】民宿在线预订平台的设计与实现
  • AI Agent 面试题 685:Agent红队测试的结果评估和修复优先级排序
  • 欧米茄中国官方售后服务中心|全部地址与售后热线电话权威信息公示(2026年7月最新) - 欧米茄官方服务中心
  • 亚马逊多店铺运营不再手忙脚乱!用优麦云优惠折扣码开通优麦云! - 跨境电商卖家出海
  • 实测对比5款工具:哪种视频转MP3效果最好? - 软件工具教程方法
  • pip 22.0+ 配置源实战:3种方法覆盖Linux/Windows/macOS,附7大国内源对比
  • 2026手机去水印软件推荐,安卓苹果安全好用免费工具教程
  • 5分钟打造你的专属知识中心:Obsidian Homepage完全指南
  • vLLM 推理引擎深度解析:PagedAttention 原理与生产级部署实战
  • 番茄小说下载器:3种方式解锁离线阅读新体验
  • 天准星智发布TADC-Orin-2控制器,550TOPS高算力打造L4智驾新引擎
  • 隐私争议下,Meta 智能眼镜更新:篡改隐私灯,相机自动禁用!
  • 2026年7月最新上海卡地亚官方售后客服电话及服务网点地址查询 - 卡地亚服务中心
  • 设计师怎么把 GPT-Image 当作灵感草图工具?从创意到提案的实战流转指南
  • 变压器生产厂家怎么选?从高频定制到工业配套,看潍坊恒信电器的完整能力 - 新思维商业观察
  • AD怎样快速更换封装类型
  • 手机视频格式怎么转?2026年三步操作简单又快速 - 软件工具教程方法
  • 2026最新sif优惠折扣码是什么?sif折扣码开通sif关键词工具助力亚马逊运营 - 跨境电商卖家出海
  • 2026年7月最新福州卡地亚官方售后客户服务电话及线下网点地址 - 卡地亚官方售后中心
  • elasticsearch学习笔记(三十一)——Elasticsearch doc value正排索引