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

✔ 无大问题

相关推荐
Drone_xjw13 小时前
解决 Qt 程序在 Kylin(麒麟)系统下表头“白屏”的问题
开发语言·qt·kylin
米优15 小时前
qt+gstreamer实现播放功能
qt·gstreamer
zjun100116 小时前
QT:语言翻译
开发语言·qt
-凌凌漆-17 小时前
【Qt】const QString &与QString的区别
开发语言·qt
Drone_xjw18 小时前
Qt QTableView 表头变白问题(Kylin/UKUI系统)原因分析与解决方案
开发语言·qt·kylin
mabing99318 小时前
Qt 实现自定义分段控制器
开发语言·qt
誰能久伴不乏18 小时前
Qt 混合编程核心原理:C++ 与 QML 通信机制详解
linux·c++·qt·架构·状态模式
sycmancia18 小时前
Qt——文本编辑器中的数据存取
开发语言·qt
小短腿的代码世界19 小时前
Qt属性系统深度解析:元对象系统的隐藏宝石
qt
小短腿的代码世界19 小时前
交易回测可视化深度解析:Qt如何让量化策略“活“起来
qt