QVariant()和QString()各个写法区别

写法 Qt 视角 isValid isNull Oracle 里
QVariant() 无类型 false false NULL
QVariant(QString()) QString true false 空串(Oracle 当 NULL)
QVariant("") QString true false 空串(Oracle 当 NULL)
QVariant(QVariant::String) QString true true NULL
写法 isNull() isEmpty()
QString() true true
QString("") false true
写法 C++类型 Qt里怎么用 说明
'A' char ❌ 不建议用于中文 普通窄字符
u'A' char16_t ✅ QChar ch = u'A'; UTF-16 单元,最适合 QChar
U'A' char32_t ⚠ 很少用 UTF-32 码点
L'A' wchar_t ❌ 不推荐 平台相关
写法 C++类型 含义 在 Qt 里的正确用法
"中文" const char[] 源码编码(通常UTF-8) ❌ 不要直接给 QString
u8"中文" const char8_t[] / const char[] 明确 UTF-8 ✅ QString::fromUtf8(u8"中文")
u"中文" const char16_t[] UTF-16 ✅ QString::fromUtf16(u"中文")
U"中文" const char32_t[] UTF-32 ⚠ 很少用
L"中文" const wchar_t[] 宽字符 ❌ 不推荐
写法 类型 用途
QStringLiteral("中文") QString ✅ 最推荐的 QString 常量写法
QLatin1String("abc") 视图 只用于纯 ASCII / Latin-1
QStringView(u"中文") 视图 指向 UTF-16 字面量
QUtf8StringView("abc")(Qt6) 视图 指向 UTF-8 数据
构造形式 说明
QString() 空
QString(const QString&) 拷贝
QString(QString&&) 移动
QString(QChar) 单字符
QString(const char16_t*, int) UTF-16
QString(QStringView) 视图
QString(QLatin1String) 拉丁1
构造函数 实际行为
QString(const char*) fromLocal8Bit
QString(const QByteArray&) fromLocal8Bit

✅ Qt 4 → Qt 6 编码迁移对照表(已纠错 · 实战版)


一、字符串字面量 & QString 构造(❗重灾区,已修正)

❌ 原表错误点

  • 把 "中文" 在 Qt 4/5/6 全部标成 local8bit

  • 把 QString("中文") 也标成 local8bit

  • 这是不区分"源码编码 vs Qt API 语义"的典型错误


✅ 正确版本

写法 Qt 4 Qt 5 Qt 6 真实语义 迁移建议
"中文" 按源码编码 按源码编码 UTF-8 C++ 字符串字面量 Qt6 OK
QString("中文") 等同 fromAscii/fromLatin1 ⚠ 依赖编译选项 fromUtf8 Qt 构造行为 Qt6 OK
QStringLiteral("中文") 可用 推荐 强烈推荐 编译期 UTF-16 ✅ 最优
u8"中文" ❌ ⚠ ✅ UTF-8 字面量 Qt6 + fromUtf8
u"中文" ❌ ⚠ ✅ UTF-16 Qt6 可用

⚠ 关键纠正说明(必须看)

  • Qt 4 / Qt 5:

    • "中文" 的行为 取决于源码文件编码

    • 不是 local8bit,而是 "你写的字节是什么"

  • Qt 6:

    • C++20 + Qt 强制假定 源码是 UTF-8

    • QString("中文") == QString::fromUtf8("中文")

✅ 结论

❌ "全版本禁止 QString("中文")"是错误结论

✅ 正确结论:

  • Qt 4/5:不安全

  • Qt 6:合法但仍不如 QStringLiteral


二、char* / QByteArray → QString(这一部分你基本对)

用法 Qt 4 Qt 5 Qt 6 正确理解
QString s = charPtr; fromLocal8Bit fromLocal8Bit fromLocal8Bit ❌ 永远危险
QString s = ba; fromLocal8Bit fromLocal8Bit fromLocal8Bit ❌ 同上
fromAscii() ✅ ⚠ deprecated ❌ → fromLatin1
fromUtf8() ✅ ✅ ✅ ✅ 主力
fromLocal8Bit() ✅ ✅ ✅ ⚠ 仅系统边界

✔ 这张表 基本正确,无需大改


三、QTextCodec / 全局编码(你这里"方向对,但说法夸张")

项目 Qt 4 Qt 5 Qt 6 正确结论
QTextCodec ✅ ⚠ deprecated ❌ Qt6 移除
setCodecForTr ✅ ⚠ ❌ Qt6 不存在
setCodecForCStrings ✅ ❌ ❌ Qt5 起已移除
全局编码切换 ⚠ ❌ ❌ Qt 从不推荐

⚠ 修正点:

  • Qt 4 从来就不推荐"全局编码切换"

  • Qt 5 不是"半残",而是功能在,但不建议用


四、QTextStream / 文件 I/O(你这里有明确错误)

❌ 原表错误

  • Qt 6 不是"setCodec 不可用"

  • setEncoding 不是"唯一正确方式"

✅ 正确版本

用法 Qt 4 Qt 5 Qt 6 说明
默认编码 本地 本地 UTF-8 Qt6 改变
setCodec("UTF-8") ✅ ✅ ⚠ 仍可用 兼容接口
setEncoding(Utf8) ❌ ❌ ✅ 新 API

✔ Qt 6 两种都能用,不是二选一


五、翻译(tr / lupdate)(你这部分基本正确)

项目 Qt 4 Qt 5 Qt 6 结论
源码编码 任意 任意 必须 UTF-8 Qt6 强制
tr("中文") 依赖 codec 依赖 UTF-8 OK
.ts 文件 任意 UTF-8 UTF-8 无坑

✔ 此表 基本正确


六、qDebug / 控制台输出(你"怪 Qt",但锅在控制台)

项目 Qt 4 Qt 5 Qt 6 真相
中文输出 易乱码 依赖环境 依赖环境 ❌ 非 Qt 问题
qDebug 行为 本地 UTF-8 UTF-8 输出没错
日志文件 OK OK OK UTF-8 即可

⚠ 修正结论:

Qt 6 并没有"仍不稳定",
不稳定的是 Windows 控制台默认 GBK


七、执行字符集 & 源码编码(这一张基本正确)

维度 Qt 4 Qt 5 Qt 6
源码编码 任意 任意 强制 UTF-8
执行字符集 本地 本地 本地
非 UTF-8 源码容忍 高 中 极低

✔ 无大问题

相关推荐
qeen8737 分钟前
【QT】 信号与槽初始
开发语言·笔记·qt·学习
Quz1 天前
QML PathView:吸附对齐与环形轮播
qt
时间的拾荒人1 天前
Qt 多线程详解:从 QThread 到实战
开发语言·qt·面试
时间的拾荒人2 天前
Qt 事件机制全解析:从事件处理到事件过滤器
开发语言·qt·面试
时间的拾荒人2 天前
Qt 窗口系统详解:从菜单栏到对话框的完整指南
开发语言·qt·面试
qq_401700412 天前
Qt 炫酷曲线,图表,2D/3D开源库
开发语言·qt
扶尔魔ocy2 天前
【qt openGL入门笔记】基础光照
qt·opengl
时间的拾荒人2 天前
Qt 文件操作详解:从基础类到读写实战
开发语言·qt·面试
扶尔魔ocy2 天前
【qt openGL入门笔记】坐标系统和摄像机
qt·opengl
C++ 老炮儿的技术栈3 天前
main函数之后的调用
c语言·c++·人工智能·qt·mfc·c