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

CString(MFC/ATL 框架)和 QString(Qt 框架)

CString(MFC/ATL 框架)和 QString(Qt 框架)是 C++ 开发中常用的字符串类,分别适用于不同的开发环境。它们在功能设计上有很多相似之处,但也存在框架特性带来的差异。以下是两者常用功能的对比:

一、基础操作对比

功能

CString(MFC)

QString(Qt)

说明

初始化

CString str = "hello";CString str(_T("hello"));

QString str = "hello";QString str("hello");

CString 需考虑 Unicode(_T 宏),QString 默认 Unicode

长度

int len = str.GetLength();

int len = str.length();

均返回字符数(非字节数)

判空

if (str.IsEmpty())

if (str.isEmpty())

空字符串判断

清空

str.Empty();

str.clear();

清空字符串内容

赋值

str = "new value";

str = "new value";

直接赋值

拼接

str += "append";str = str1 + str2;

str += "append";str = str1 + str2;

运算符重载一致

比较

if (str1 == str2)str.Compare(str2)(返回 0 表示相等)

if (str1 == str2)str1.compare(str2)(返回 0 表示相等)

Compare 均区分大小写

大小写转换

str.MakeUpper();str.MakeLower();

str = str.toUpper();str = str.toLower();

CString 是原地修改,QString 返回新对象

子串提取

str.Mid(start, length)(从 start 取 length 个字符)

str.mid(start, length)

参数和行为一致

前缀 / 后缀判断

str.Left(length)(取左侧 length 字符)str.Right(length)(取右侧 length 字符)

str.left(length)str.right(length)

功能完全对应

二、字符串查找与替换

功能

CString(MFC)

QString(Qt)

说明

查找子串

int pos = str.Find("sub");(返回索引,-1 表示未找到)

int pos = str.indexOf("sub");

基础查找功能一致

反向查找

int pos = str.ReverseFind('c');(仅单个字符)

int pos = str.lastIndexOf("sub");(支持子串)

QString 功能更灵活

替换子串

str.Replace("old", "new");

str.replace("old", "new");

均支持全局替换

是否包含子串

bool has = str.Find("sub") != -1;

bool has = str.contains("sub");

QString 有专门的 contains 方法

三、数值转换

功能

CString(MFC)

QString(Qt)

说明

字符串转整数

int num = _ttoi(str);

int num = str.toInt();

QString 可指定进制(如 str.toInt (nullptr, 16) 转十六进制)

字符串转浮点数

double num = _tcstod(str, nullptr);

double num = str.toDouble();

CString 依赖 C 库函数,QString 有原生方法

整数转字符串

CString str; str.Format(_T("%d"), 123);

QString str = QString::number(123);

QString 格式更简洁,支持进制参数

浮点数转字符串

str.Format(_T("%.2f"), 3.14);

str = QString::asprintf("%.2f", 3.14); 或 str = QString("%1").arg(3.14, 0, 'f', 2);

Qt 的 arg () 方法更安全灵活

四、编码转换

功能

CString(MFC)

QString(Qt)

说明

Unicode 转 ANSI

CStringA ansiStr = CStringA(str);

QByteArray ansi = str.toLocal8Bit();

转为本地编码(通常是 GBK 或 UTF-8)

转 UTF-8

CStringA utf8Str = CW2A(str, CP_UTF8);(需 ATL 转换宏)

QByteArray utf8 = str.toUtf8();

QString 原生支持,更简洁

ANSI 转 Unicode

CStringW unicodeStr = CA2W(ansiStr, CP_ACP);

QString str = QString::fromLocal8Bit(ansi);

从本地编码解析字符串

从 UTF-8 构造

CStringW str = CA2W(utf8Str, CP_UTF8);

QString str = QString::fromUtf8(utf8);

直接从 UTF-8 字节数组构造

五、其他特色功能

功能

CString(MFC)

QString(Qt)

说明

格式化字符串

str.Format(_T("Name: %s, Age: %d"), name, age);

str = QString("Name: %1, Age: %2").arg(name).arg(age);

Qt 的 arg () 支持参数重排(如 %2 先于 %1),更安全

修剪空白字符

str.Trim();(去除首尾空格)str.TrimLeft();/TrimRight()

str = str.trimmed();(去除首尾空白)str = str.trimLeft();/trimRight()

功能类似,QString 支持更多空白字符(如制表符)

分割字符串

/

QStringList list = str.split(';');

QStringList 比 CStringArray 功能更丰富

正则表达式

无原生支持(需借助 C 库或第三方库)

QRegExp rx("pattern");bool match = rx.exactMatch(str);

Qt 内置正则支持,功能强大

国际化支持

需结合 MFC 资源 DLL

与 Qt Linguist 无缝集成,支持 .qm 翻译文件

Qt 国际化更便捷,是框架核心特性之一

六、核心差异总结

  1. 编码处理
    • CString 分 CStringA(ANSI)和 CStringW(Unicode),需显式处理编码转换(依赖宏或 ATL 转换类)。
    • QString 内部始终使用 Unicode(UTF-16),编码转换通过 toUtf8()、fromLocal8Bit() 等方法轻松实现,无需关注底层细节。
  1. 框架依赖
    • CString 是 MFC/ATL 的一部分,仅在 Windows 平台有效,与 MFC 控件(如 CEdit)交互更自然。
    • QString 是 Qt 框架的核心类,跨平台(Windows/Linux/macOS),与 Qt 控件(如 QLineEdit)无缝对接。
  1. 功能设计
    • CString 设计简洁,适合轻量字符串操作,依赖 Windows API 扩展功能。
    • QString 功能更全面(内置正则、国际化、安全格式化),面向现代 C++ 开发,避免原始指针操作。
  1. 内存管理
    • 两者均自动管理内存(无需手动释放),但 QString 采用写时复制(Copy-On-Write)优化,效率更高。

根据开发场景选择:Windows 平台的 MFC 项目优先用 CString,跨平台或 Qt 项目必须用 QString。两者在基础字符串操作上逻辑相似,迁移时主要注意编码转换和框架特有功能的差异。


文章转载自:

http://ycjLI98M.djxnn.cn
http://qDMVdpEx.djxnn.cn
http://ifnAnoo0.djxnn.cn
http://3dcZ8i2I.djxnn.cn
http://kSVGeC0B.djxnn.cn
http://EaBDt9M9.djxnn.cn
http://AgrMDe70.djxnn.cn
http://dwXqBmkk.djxnn.cn
http://mqwRFG5k.djxnn.cn
http://KCYGyCSY.djxnn.cn
http://Sx93SCeX.djxnn.cn
http://54zWkBYk.djxnn.cn
http://twAMkhPI.djxnn.cn
http://flxGIFDQ.djxnn.cn
http://OsGZRZ4X.djxnn.cn
http://LrdXacWo.djxnn.cn
http://nowGVwWG.djxnn.cn
http://oit8CALv.djxnn.cn
http://Ou6HlolY.djxnn.cn
http://OwgdmdAn.djxnn.cn
http://DHNghXZA.djxnn.cn
http://GbTzN1rv.djxnn.cn
http://3t84qzr0.djxnn.cn
http://PSwofptL.djxnn.cn
http://BHvjM0vQ.djxnn.cn
http://9XUl6oAO.djxnn.cn
http://ZRQrktFZ.djxnn.cn
http://gZNVdeSW.djxnn.cn
http://U2REJNxP.djxnn.cn
http://6esnQwF4.djxnn.cn
http://www.dtcms.com/a/374775.html

相关文章:

  • Sklearn(机器学习)实战:鸢尾花数据集处理技巧
  • 工具框架:Scikit-learn、Pandas、NumPy预测鸢尾花的种类
  • AI GEO 优化能否快速提升网站在搜索引擎的排名?​
  • nvm和nrm的详细安装配置,从卸载nodejs到安装NVM管理nodejs版本,以及安装nrm管理npm版本
  • 对口型视频怎么制作?从脚本到成片的全流程解析
  • 从“能说话”到“会做事”:AI Agent如何重构日常工作流?
  • 洛谷 P1249 最大乘积-普及/提高-
  • 小红书获取笔记详情API接口会返回哪些数据?
  • JAVA Spring Boot maven导入使用本地SDK(jar包)
  • Linux/UNIX系统编程手册笔记:SOCKET
  • F5和Nginx的区别
  • 9.9网编简单TCP,UDP的实现day2
  • Day39 SQLite数据库操作与HTML核心API及页面构建
  • Vue3 与 AntV X6 节点传参、自动布局及边颜色控制教程
  • 线程与进程的区别
  • RAC概念笔记
  • 如何将视频从安卓手机传输到电脑?
  • Day04_苍穹外卖——套餐管理(实战)
  • ElementUI 组件概览
  • fifo之读写指针
  • 【第三次全国土壤普查】一键制备土壤三普环境变量23项遥感植被指数神器
  • Java反射机制详解
  • PDF文件中的广告二维码图片该怎么批量删除
  • 记一次 .NET 某中医药附属医院门诊系统 崩溃分析
  • WPF/Prism 中计算属性的通知机制详解 —— SetProperty 与 RaisePropertyChanged
  • jmeter使用指南
  • 硬件(六)arm指令
  • 后端错误处理的艺术:BusinessException 与 ResultUtils 的完美分工
  • MCU、CPLD、DSP、FPGA 有什么区别,该如何选择?
  • 【React Native】点赞特效动画组件FlowLikeView