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

✔ 无大问题

相关推荐
我在人间贩卖青春5 小时前
Qt 项目发布
qt·项目发布
不才小强9 小时前
Qt开发实战:屏幕录制项目中学习到的知识与遇到的难题
qt·音视频
人还是要有梦想的10 小时前
QT的基本学习路线
开发语言·qt·学习
艾莉丝努力练剑11 小时前
【QT】QT快捷键整理
linux·运维·服务器·开发语言·图像处理·人工智能·qt
黑化暴龙魔神--幻梦11 小时前
QT使用TRANSLATIONS添加多国翻译(详细过程)
qt·自动翻译
程序员_大白11 小时前
【2025版】最新Qt下载安装及配置教程(非常详细)零基础入门到精通,收藏这篇就够了
开发语言·qt
我在人间贩卖青春11 小时前
Qt多媒体编程
qt·多媒体编程
高亚奇11 小时前
QT版本 MSVC/MinGW/GCC 含义及如何区分
开发语言·qt
IdahoFalls11 小时前
QT-Windows Kits-版本问题:【“_mm_loadu_si64”: 找不到标识符】解决方案[NEW]
开发语言·c++·windows·qt·算法·visual studio
希忘auto11 小时前
详解关于VS配置好Qt环境之后但无法打开ui界面
qt·vs