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

✔ 无大问题

相关推荐
郑同学zxc18 小时前
机器视觉10-Qt联合Halcon开发环境配置
开发语言·qt
踏过山河,踏过海1 天前
qt设置exe图标
qt
yangpipi-1 天前
PyQt5快速开发与实战 第3章 QtDesigner
开发语言·qt
来鸟 鸣间1 天前
Qt 组件安装
qt
csdn_zhangchunfeng1 天前
QML之解决GaussianBlur部分区域出现锯齿
前端·javascript·qt
开始了码1 天前
如何打包qt项目为.exe
开发语言·qt
来鸟 鸣间1 天前
Qt creator快捷键
qt
草莓熊Lotso1 天前
Qt 对话框全家桶实战:模态 / 非模态 + 5 大内置对话框全攻略
运维·c语言·开发语言·c++·人工智能·qt·ui
江公望1 天前
Qt QJsonDocument 10分钟讲清楚
开发语言·qt
wybarcelona2 天前
windows下使用Qt Creator开发调试的注意事项
开发语言·qt