Qt报错: error: C2001: 常量中有换行符,解决QT运行时有中文乱码

2023-10-26

Qt系列文章目录

前言

在编译别人的Qt工程中,总会遇到莫名其妙的问题,在别人机器上运行好好的工程,拷贝到自己机器上往往会报各种错误。首先代码是没有问题的,问题一般都处在Qt的版本不同、配置不同、中文编码格式的问题等等。特别是工程中含有中文字符的时候。
在这里插入图片描述
在这里插入图片描述

一、问题原因

在UTF-8中,一个汉字占3个字节(一个字符占一个字节)
BOM即byte order mark ,中文名译作“字节顺序标记”。在UCS 编码中有一个叫做 “Zero Width No-Break Space” ,中文译名作“零宽无间断间隔”的字符,它的编码是 FEFF。而 FEFF 在 UCS 中是不存在的字符,所以不应该出现在实际传输中。UCS 规范建议我们在传输字节流前,先传输字符 “Zero Width No-Break Space”。这样如果接收者收到 FEFF,就表明这个字节流是 Big-Endian 的;如果收到FFFE,就表明这个字节流是 Little- Endian 的。因此字符 “Zero Width No-Break Space” (“零宽无间断间隔”)又被称作 BOM。UTF-8 不需要 BOM 来表明字节顺序,但可以用 BOM 来表明编码方式。字符 “Zero Width No-Break Space” 的 UTF-8 编码是 EF BB BF。所以如果接收者收到以 EF BB BF 开头的字节流,就知道这是 UTF-8编码了。Windows 就是使用 BOM 来标记文本文件的编码方式。

UTF-8 不需要 BOM,尽管 Unicode 标准允许在 UTF-8 中使用 BOM。所以不含 BOM 的 UTF-8 才是标准形式,在 UTF-8 文件中放置 BOM 主要是微软的习惯(顺便提一下:把带有 BOM 的小端序 UTF-16 称作「Unicode」而又不详细说明,这也是微软的习惯)。BOM(byte order mark)是为 UTF-16 和 UTF-32 准备的,用于标记字节序(byte order)。微软在 UTF-8 中使用 BOM 是因为这样可以把 UTF-8 和 ASCII 等编码明确区分开,但这样的文件在 Windows 之外的操作系统里会带来问题。

二、解决办法

1.第一种方法:改变文件的编码格式

使用notepad++等文本编辑器打开.h/.cpp文件,
在这里插入图片描述
然后文件另存为即可。注意,这个方法有个问题,这种编码格式的转换是不可逆的,即 如果你之前的文件文本格式是ANSI编码,你现在转换成UTF-8,如果你再想把UTF-8转换成ANSI编码多半会发生错误。

2.第二种方法:修改代码

凡是有中文的地方前面一律加上"u8"

Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);

    //隐藏表头
    ui->treeWidget->setHeaderHidden(true);

    //打开右键菜单属性
    ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);

    //添加顶层节点
    QTreeWidgetItem *topItem1 = new QTreeWidgetItem(ui->treeWidget);
    topItem1->setText(0,u8"百度");
    ui->treeWidget->addTopLevelItem(topItem1);

    //右键菜单
    m_menu = new QMenu(ui->treeWidget);
    m_menu->addAction(u8"添加");
    m_menu->addAction(u8"删除");

    QTreeWidgetItem *item11 = new QTreeWidgetItem(topItem1);
    item11->setText(0,u8"研发部");
    //设置数据,可以带多种数据
    item11->setData(0,Qt::UserRole,100/*人员数量*/);
    item11->setData(0,Qt::UserRole+1,"李彦宏"/*负责人名字*/);

    //获得数据
    item11->data(0,Qt::UserRole).toInt();
    item11->data(0,Qt::UserRole+1).toString();

    QTreeWidgetItem *item12 = new QTreeWidgetItem(topItem1);
    item12->setText(0,u8"销售部");
    QTreeWidgetItem *item13 = new QTreeWidgetItem(topItem1);
    item13->setText(0,u8"人事部");

    QTreeWidgetItem *topItem2 = new QTreeWidgetItem(ui->treeWidget);
    topItem2->setText(0,u8"腾讯");
    topItem2->setCheckState(0,Qt::Checked);
    ui->treeWidget->addTopLevelItem(topItem2);

    QTreeWidgetItem *item21 = new QTreeWidgetItem(topItem2);
    item21->setText(0,u8"研发部");
    item21->setCheckState(0,Qt::Checked);
    QTreeWidgetItem *item22 = new QTreeWidgetItem(topItem2);
    item22->setText(0,u8"销售部");
    item22->setCheckState(0,Qt::Checked);
    QTreeWidgetItem *item23 = new QTreeWidgetItem(topItem2);
    item23->setText(0,u8"人事部");
    item23->setCheckState(0,Qt::Checked);

    //设置展开
    ui->treeWidget->expandAll();

    ui->treeWidget->setStyleSheet(styles);

    connect(ui->treeWidget,&QTreeWidget::itemClicked,this,
            &Form::slotClicked);

    connect(ui->treeWidget,&QTreeWidget::customContextMenuRequested,
            this,&Form::slotMenuPopup);

}

在这里插入图片描述

总结

感觉还是第二种办法好,适用性更强。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt报错: error: C2001: 常量中有换行符,解决QT运行时有中文乱码 的相关文章

  • Qt4.5:在 app.exec 之前使用基于事件循环的 localsocket

    我遇到了 Qt 的实际问题 我正在使用一个与 QLocalSocket 与另一个进程 管道 unix 套接字 通信的类 并且我需要在其他事件发生之前进行通信 即在 app exec 启动之前 或更准确地说 应用程序启动后立即进行 我正在使用
  • QComboBox 是否可以显示与其列表中不同的值?

    在 Linux 上使用 Qt 5 9 我有一个带有多个标签的 QComboBox qc new QComboBox qc gt addItem tr Red qc gt addItem tr Green qc gt addItem tr B
  • 将事件传递/转发到 Qt 中的子对象

    我正在开发 Qt 应用程序 但在将鼠标事件获取到我想要的位置时遇到问题 这是我所拥有的高级视图 每个级别上还发生其他事情 这些事情决定了视图和场景的需求 App Window QMainWindow View QGraphicsView G
  • 为什么Qt在qobject_cast、事件类型等方面重新实现RTTI?

    为什么 Qt 费心去重新实现相当于自定义 RTTI 系统和他们自己的系统 dynamic cast in the QObject层次结构 在QEvent etc 首先 Qt 中只有少数类层次结构实际上需要 RTTI 当您生成嵌入式代码时 您
  • Qt 线程阻止 UI 响应

    我想我可能误解了Qt线程中的几个概念 在我的窗口类中 它派生自 QWidget class Widget Q OBJECT public Widget Widget QObject parent 0 QObject parent moveT
  • Qt - 如何将数据与 QTableWidgetItem 关联?

    我想将附加数据与插入表中的每个 QTableWidgetItem 相关联 以便将来在单击表项时使用该数据 但这些数据不应该是可见的 我怎样才能做到这一点 您可以使用QTableWidgetItem setData http doc qt i
  • 将 qDebug 重定向到 QTextEdit

    我想用qInstallMessageHandler handler 重定向qDebug to QTextEdit 我在类中定义了一个处理函数 void Spider redirect QtMsgType type const QMessag
  • Qt 不支持 Visual Studio 的 Unicode 或字体错误

    我是初学者 现在我正在学习 Qt 并使用 Visual Studio 扩展 Qt VS Tool 2 4 3 我使用的文本是越南语 当我构建程序时 它很好 但按钮显示特殊字符 我已经阅读了一些有关字体错误的主题 但它与此错误无关 我的代码
  • 如何在使用 QSS 悬停父 QFrame 时设置子 QLabels 的颜色?

    我试图使用样式表设置 QFrame 内 2 个标签的悬停状态颜色 但无论是否存在实际悬停 框架都会采用悬停状态 See screenshot 我有一个带有 QLabels 的 QFrame 我将默认颜色设置为绿色和紫色 当我将鼠标悬停在 Q
  • 如何以编程方式在 qml 中渲染 vtk 项目?

    到目前为止 我了解到我们在 QML 中有两个线程 我们的主应用程序线程和我们的 场景图 线程 http doc qt io qt 5 qtquick visualcanvas scenegraph html http doc qt io q
  • 在 Mac 上启动没有停靠图标的 Qt 托盘进程

    我有一个包含 GUI 服务和托盘的捆绑包 请注意 它们是三个独立的过程 这可能听起来很奇怪 托盘是服务的代表 用户可以打开 GUI 如果没有托盘存在 它会创建一个托盘 所以在我的 GUI 代码中我有如下内容 QProcess startDe
  • 无法在 mac osx 上的 QT 中创建新项目

    过去几天我一直坚持这个问题 我已经安装了 QT 4 8 并且也安装了库 但是当我开始创建一个新项目时 我只能选择使用 CMake 创建一个普通的 C 项目 我没有使用自动 qmake 的选项 我不知道为什么 如果有人可以帮忙 我们将不胜感激
  • 为什么我的自定义图形项目在基于 Qt 的 C++ GUI 应用程序中不断重新绘制?

    我的应用程序有一个 QMdiArea 其中显示子窗口 其中包含 QGraphicsView 派生视图 GfxInteractiveView 的实例 这些视图又可视化包含自定义 QGraphicsItem 派生项目的场景 An image i
  • QList、QVector 或 std::vector 多线程使用

    我希望两个线程像这样工作 第一个线程会将值附加到向量 第二个线程将通过索引对元素进行只读访问 我可以在第二个线程开始读取之前创建互斥体并进行深度复制 但是这种方式真的很慢 如何在没有互斥体的情况下进行此操作 这里 STL向量和线程安全 ht
  • 具有最简单学习曲线的 C++ GUI 构建选项是什么 - VS/Qt/wxWidgets/等等?

    我希望能够尽可能快速 轻松地构建 GUI 应用程序 我有能力 虽然不是专家 也没有接受过正式的培训 C 但从未使用过 GUI 构建工具包或框架或任何东西 我不是专业程序员 在构建 GUI 应用程序方面完全没有经验且无知 花了几个小时研究试图
  • 如何在 Qt 中使用 QTabWidget 创建多行选项卡?

    我尝试使用 QTabWidget 创建一个多行选项卡 如下所示 我也设置了tabPosition 南但我不能有多行选项卡 因为所有选项卡都是水平的 所有选项卡都在一行中 而不是多行 这些是我得到的标签 我读过了这个帖子 https stac
  • 如果值包含逗号字符,如何使用 QSetting 读取值[重复]

    这个问题在这里已经有答案了 在我的 QT 项目中 我使用 QSettings 从 ini 文件读取值 如果该值包含逗号字符 QSettings 无法读取它 我应该如何读取这些值 逗号字符被视为列表分隔符QSettings 带逗号的 INI
  • 如何在 QML 中使用 Font Awesome

    有谁知道如何在 QML 中使用 Font Awesome 吗 我找不到任何文档或任何信息如何在 QML 中使用 Font Awesome 我喜欢做的是使用fontello http fontello com 创建最小的图标集 而不是从 Fo
  • 我可以取消选中组框中的一组 RadioBottom 吗?

    组 Box 内的单选底部将被视为一组底部 它们是互斥的 我怎样才能清理他们的检查状态 我有几件收音机底部 其中一件经过检查 我怎样才能 清洁 取消选中 所有收音机底部 setChecked 在组内不起作用 我尝试做以下事情但失败了 我的代码
  • 单击旁边的按钮时如何引用动态创建的标签 [Qt]

    每次按下 添加客户端 按钮时 减号按钮 客户端名称 客户端计数器和加号按钮都会以水平线添加到网格布局中 我想在按下加号 减号按钮时更新计数 QLabel 这是我的代码 include widget h include ui widget h

随机推荐

  • arm嵌入式led灯闪烁实验报告_led闪烁实验报告.doc

    led闪烁实验报告 篇一 单片机实验 LED灯闪烁实验 实 验 报 告 课程名称 实验项目 2016年 3 月 13 日 实验目的 1 掌握51单片机开发板的使用步骤 2 掌握51单片机开发板所需软件的安装过程 3 以LED灯闪烁为例子 掌
  • express:webpack dev-server中如何将对后端的http请求转到https的后端服务器中?

    在上一篇文章 Webpack系列 在Webpack Vue开发中如何调用tomcat的后端服务器的接口 我们介绍了如何将对于webpack dev server的数据请求转发到后端服务器上 这在大部分情况下就够用了 然后现在问题又来了 在生
  • qt中ui的 使用介绍

    1 什么是ui ui通常是用Qt 设计师设计出来的界面文件的后缀 通常情况下ui是一个指向这个界面类的指针 ui gt 一般就是用来访问这个界面类里面的控件 例如你的ui文件里有一个叫okButton的QPushButton 你就可以这样来
  • Apache Hook机制解析(下)——实战:在自己的代码中使用Apache的钩子

    在前文 Apache Hook机制解析 上 钩子机制的实现 和 Apache Hook机制解析 中 细节讨论 的基础上 我们对Apache的钩子机制已经有了较多的了解 下面的代码实战演示了一个日志钩子的声明 定义和使用 在VC6 0上编译测
  • MMClassification(一)

    1 介绍 一句话总结 基于pytorch的强大模块化组件式的分类框架 相关资料 中文文档 GitHub 课程学习 深入学习直接使用官方文档学习效果最好 本文记录学习过程知识以便快速回顾和查找 其中包含个人的学习总结 仅做参考 2 项目结构
  • 刷脸支付还可以带来新的互动体验和应用

    支付宝领先的微信支付是依附于电商的绝对优势 微信支付凭借其10亿用户的优势 正在与支付宝抗衡 近几年来 移动支付的快速发展带动了支付技术的变革 nfc支付 二维码支付 指纹支付等支付方式活跃在我们的日常生活中 随着人脸识别技术的成熟和人们对
  • 三菱FX3U——ST编程红绿灯

    一个循环周期是32秒 南北向绿灯和东西向红灯亮10秒后 两侧黄灯亮3秒 黄灯在闪烁3秒 南北向红灯和东西向绿灯亮10秒 两侧黄灯亮3秒 黄灯在闪烁3秒 添加启动和停止 按下启动按钮 使定时器复位 通过置位M0 让标签的状态赋值给输出点 通过
  • DataGrip的简单使用笔记

    目录 导入数据 关键字导航 全局搜索 结果集搜索 导航到关联数据 结果集数据过滤 行转列 变量重命名 自动检测无法解析的对象 权限定字段名 通配符自动展开 大写自动转换 sql格式化 多光标模式 代码注释 列编辑 https pan bai
  • rk3399 高可靠OTA升级

    https blog csdn net m0 37631324 article details 106254910
  • auto_deleter 使用,定义自动销毁对象

    template
  • Windows中安装ElasticSearch(单机+集群+Kibana)

    系统版本 Windows 10 ElasticSearch版本 7 15 2 https artifacts elastic co downloads elasticsearch elasticsearch 7 15 2 windows x
  • linux 网卡驱动升级,安装或更新CentOS平台的网卡驱动程序

    基于Linux平台安装或更新网卡驱动程序与Windows平台相差不大 首先查阅出主机网卡的具体型号 Windows平台可以借助鲁大师等硬件检测工具查看网卡 Linux平台有适用的命令lspci ethtool查看 在CentOS6 7平台下
  • 【欧拉openEuler 】 ssh安装、配置和远程控制

    1 查看SSH是否安装 一般是默认安装好了的 changairjb localhost rpm qa grep ssh libssh 0 9 5 1 oe1 aarch64 openssh 8 2p1 13 oe1 aarch64 open
  • 01-初识HTML

    01 初识HTML 学习目标 理解HTML的基本语法 掌握排版标签实现标题等效果 相对路径和绝对路径 媒体标签 图片 音频 视频 超链接 一 基础认知 了解网页组成和五大浏览器 明确Web标准的构成 1 1 认识网页 以下网页有哪些部分组成
  • (C语言)16进制转10进制

    include
  • Java反射机制与Method的invoke方法实现

    一 什么是反射 1 Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息 从而操作类或对象的属性和方法 本质是JVM得到class对象之后 再通过class对象进行反编译 从而获取对象的各种信息 2 Java属于先编译再运行的语
  • 机械革命黑苹果改造计划第四番-外接显示器、win时间不正确问题解决

    问题 1 无法外接显示器 最大的问题就是目前无法外接显示器 因为机械革命大多数型号笔记本电脑的HDMI DP接口都是直接物理接在独显上的 内屏用核显外接显示器接独显 英伟达独显也是黑苹果无法驱动的 而且发现机械革命tpyec接口还减配了没有
  • CSA作业

    1 修改当前主机名为rhcsa 设置当前时区为Asia Shanghai 2 在 home和 root目录下面创建file1文件和dir1目录 3 在 home file1文件里面写入内容hello welcome to home 4 在
  • Python中进程和线程详解与四款Python程序库

    Num01 gt 线程 线程是操作系统中能够进行运算调度的最小单位 它被包含在进程之中 是进程中的实际运作单位 一个线程指的是进程中一个单一顺序的控制流 一个进程中可以并发多条线程 每条线程并行执行不同的任务 Num02 gt 进程 进程就
  • Qt报错: error: C2001: 常量中有换行符,解决QT运行时有中文乱码

    Qt系列文章目录 文章目录 Qt系列文章目录 前言 一 问题原因 二 解决办法 1 第一种方法 改变文件的编码格式 2 第二种方法 修改代码 总结 前言 在编译别人的Qt工程中 总会遇到莫名其妙的问题 在别人机器上运行好好的工程 拷贝到自己