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 源码容忍 高 中 极低

✔ 无大问题

相关推荐
小王C语言32 分钟前
Qt常用控件:按钮类控件,普通按键、单选、复选
开发语言·qt
初阳78511 小时前
【基于Qt5仿音乐播放器(六)】——细节打磨与总结
qt·1024程序员节
小鱼仙官20 小时前
使用Qt封装C/C++ 动态库 用于第三方调用
c语言·c++·qt
扶尔魔ocy1 天前
【QT OpenGL】知识点编目及传送门
qt·opengl·osg
qq_401700411 天前
Qt Modbus 源码剖析:从 QModbusClient 到工业级通信框架
开发语言·qt·系统架构
GreenHandBruce1 天前
基于Qt 6.12.0 + FFmpeg 9.0.2的4k视频播放器
qt·ffmpeg·音视频
誰能久伴不乏1 天前
桌面客户端的运行日志系统:SQLite 分块 + 独立写线程 + 文本降级
数据库·c++·qt·架构·sqlite
沫璃染墨2 天前
《Qt从零入门系列(十五):Qt线程安全与锁机制详解——从QMutex到RAII与读写锁实战》
开发语言·c++·qt·安全·交互·线程·qt6.3
小豆庄2 天前
视频脱敏引擎的追踪难题:转场误判定、ID撞号和淡入窗口
qt·算法·目标检测·音视频·视频·敏捷流程
小灰灰搞电子2 天前
Qt 中使用 QSettings 存储结构体数据详解
开发语言·qt