QT5.14.2版本中QString、QByteArray以及中文编码

本文深入探讨Qt中的字符串类型,包括QString和QByteArray的使用方法,以及它们在处理中文编码时的差异。通过实例展示了QString和QByteArray的基本操作,如填充、查找、数值转换等,并对比了不同编码方式对中文字符串的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • Qt中字符串常用的类型
类型介绍
QStringQString想当于std中的string,在使用时不用像char *那样担心会超出范围或者漏写一个’\0’,这一切的工作C++会帮你处理好。你只需要正确使用Qt中提供的各种方法、函数接口即可。
QByteArray字面意思,字节数组,就比如使用char [];不同的是QByteArray返回大小时,不会考虑到最终’\0’的一个字节大小

一、QString用法

~···

QString具体用法参考:https://blog.youkuaiyun.com/yc__coder/article/details/107261092

~···

二、QByteArray用法

1、简介

字节数组,主要存放二进制数组。它与char []相同,但是更容易使用。和QString同级。

2、基本函数

.data()

    QByteArray array("helloooo");
    char * data = array.data();
    qDebug() << data;		//helloooo

输出helloooo,注意⚠️这里是没有双引号的。
因为这里直接就当作是一个 data[] 数组来处理了。

.fill()

    QByteArray array("helloooo");
    array = array.fill('c');		//按照当前大小全部改为c
    qDebug() << array;		//"cccccccc"

    QByteArray array("helloooo");
    array = array.fill('c',3);		//改三个字符为c,其余的全部删除
    qDebug() << array;		//"ccc"

QByteArray::fill(char c, int size = -1)是原型,所以默认是-1,也就是默认大小不改变,否则大小改成指定大小,这个函数和QString::fill功能相同。

.indexOf()

    QByteArray array("hellooolo");
    int flag = array.indexOf('l');
    std::cout << flag << std::endl;		//2

    QByteArray array("hellooolo");
    int flag = array.indexOf('l',4);
    std::cout << flag << std::endl;		//7

QByteArray::indexOf(char c, int from = 0)原型,后面的from是指从第几索引开始计算。 默认是0,也就是第一个字符开始。

.isEmpty() && .isNull()

    QByteArray array;
    qDebug() << array.isNull() << array.isEmpty();	//true true

    QByteArray array("");
    qDebug() << array.isNull() << array.isEmpty();	//false true

isEmpty为true时,isNull肯定为true,这和QString也是一样的。

::number()

    qDebug() << QByteArray::number(2020);		//"2020"

用法和QString相同,原型为QByteArray::number(int , int base = 10)整形,配上进制数,默认为十进制,范围在 [2, 36]。

.toDouble() && .toFloat() && .toInt()

    QByteArray array("2020.3232323");
    std::cout << array.toDouble() << std::endl;		//2020.32

    QByteArray array("2020.3232323");
    std::cout << array.toFloat() << std::endl;		//2020.32

    QByteArray array("2020.3232323");
    std::cout << array.toInt() << std::endl;		//0

    QByteArray array("2020");
    std::cout << array.toInt() << std::endl;		//2020

.setNum()

    QByteArray array;
    array.setNum(2020);
    qDebug() << array;		//"2020"

具体不阐述,原型QByteArray::setNum(int , int base = 10)

.size()

    QByteArray array("helloooo");
    std::cout << array.size() << std::endl;		//8

不解释

三、中文编码

引言

QString对字符串使用unicode编码。

unicode编码:具体参考网页 Unicode_百度百科

Unicode(又称统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。
UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。

举例感知编码方式差异

  1. 例一
    QString str("先挣一个亿");
    qDebug() << str;
    qDebug() << str.toUtf8();
    qDebug() << str.toLatin1();
    qDebug() << str.toLocal8Bit();
    qDebug() << str.unicode();

输出如下

"先挣一个亿"
"\xE5\x85\x88\xE6\x8C\xA3\xE4\xB8\x80\xE4\xB8\xAA\xE4\xBA\xBF"
"?????"
"\xE5\x85\x88\xE6\x8C\xA3\xE4\xB8\x80\xE4\xB8\xAA\xE4\xBA\xBF"
0x7fabb370e338

在编译时,进程将汉字直接存储到str中,没有进行编码工作;如果直接读取str也是不进行编码工作的,所以进去什么样出来也就什么样。可以想象,在执行构造函数时,QString将汉字变为遗传二进制保存,在读取str时也是将这串二进制解读,但是如果调用编码方式,反而会改变原序列,那么就容易出现乱码。

再看下一例子。

  1. 例二
    QString str = QString::fromLatin1("先挣一个亿");
    std::cout << str.data() << std::endl;
    std::cout << str.toUtf8().data() << std::endl;
    std::cout << str.toLatin1().data() << std::endl;
    std::cout << str.toLocal8Bit().data() << std::endl;
    std::cout << str.unicode() << std::endl;

输出

0x7fec685093f8
å
ˆæŒ£ä¸€ä¸ªäº¿
先挣一个亿
å
ˆæŒ£ä¸€ä¸ªäº¿
0x7fec685093f8

将str保存为Latin编码方式,输出时在再转码。

<think>好的,我现在需要帮助用户解决如何在Qt 5.14.2中添加或创建新组件的问题。首先,我得回顾一下用户提供的引用内容,看看有没有相关的信息。引用[2]提到用户自定义控件并添加到QT里,支持直接拖动使用,这可能直接相关。另外,引用[3]和引用[5]涉及Qt安装和应用程序结构,可能对理解整体流程有帮助。 首先,用户可能想知道如何创建自定义组件,比如继承现有的Qt控件,然后将其添加到Qt Designer中以便可视化拖放。根据引用[2],用户的环境是Qt5.14.2和VS2017,所以需要确保步骤适用于这个版本。步骤可能包括创建自定义控件类、编译成插件、配置Qt Designer来加载插件。 接下来,我需要考虑创建自定义组件的具体步骤。通常步骤包括:1)创建子类化的控件,比如QWidget或QPushButton;2)编写插件代码,继承QDesignerCustomWidgetInterface;3)编译生成动态库;4)将插件文件放到Qt Designer的插件目录;5)验证是否成功。需要注意的是Qt版本和编译器的兼容性,比如使用MSVC2017的编译器编译插件,否则可能无法加载。 另外,用户可能遇到问题,比如插件没有正确加载,这时候需要检查环境变量、插件路径是否正确,或者是否重新构建了插件。引用[4]提到重装Qt时路径一致可以保留配置,这可能和插件安装路径有关,所以需要确保插件放在正确的目录下,比如Qt安装目录下的plugins/designer文件夹。 可能还需要涉及.pro文件的配置,添加必要的库和头文件路径,确保插件能够正确编译。例如,在.pro文件中添加QT += designer和CONFIG += plugin,这样生成的是插件类型的库。 用户可能还想知道如何将自定义组件集成到项目中,比如在代码中包含头文件,或者如何在Qt Designer中看到新控件。引用[3]提到在VS中创建Qt项目,可能需要重启Qt Designer或VS才能看到新控件,这属于常见问题。 总结下来,回答的结构应该是步骤化的,先创建控件类,再写插件,编译,安装插件,然后验证。同时要提醒注意事项,比如编译器匹配、路径正确等。可能还需要引用相关的引用内容,比如引用[2]中的开发环境和步骤,引用[4]的路径一致性,确保用户操作正确。</think>### 如何在 Qt 5.14.2 中添加或创建新组件? 在 Qt 5.14.2 中创建自定义组件并集成到 Qt Designer 中,可以通过以下步骤实现: --- #### **1. 创建自定义组件类** 自定义组件需要继承 Qt 的基类(如 `QWidget`、`QPushButton` 等),并实现其功能。 **示例代码(`custombutton.h`):** ```cpp #include <QPushButton> class CustomButton : public QPushButton { Q_OBJECT // 必须包含宏以支持元对象系统 public: explicit CustomButton(QWidget *parent = nullptr); // 添加自定义方法和信号/槽 }; ``` --- #### **2. 编写插件类** Qt Designer 插件需要继承 `QDesignerCustomWidgetInterface`,用于向设计器注册组件。 **示例代码(`custombuttonplugin.h`):** ```cpp #include <QDesignerCustomWidgetInterface> class CustomButtonPlugin : public QObject, public QDesignerCustomWidgetInterface { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: explicit CustomButtonPlugin(QObject *parent = nullptr); // 必须实现的接口方法 QString name() const override; QString group() const override; QIcon icon() const override; QString toolTip() const override; QWidget *createWidget(QWidget *parent) override; QString includeFile() const override; }; ``` --- #### **3. 配置项目文件(`.pro`)** 在项目文件中声明插件依赖和编译规则: ```makefile QT += core gui designer # 添加 designer 模块 CONFIG += plugin # 声明为插件类型 TARGET = custombuttonplugin TEMPLATE = lib SOURCES += custombutton.cpp custombuttonplugin.cpp HEADERS += custombutton.h custombuttonplugin.h ``` --- #### **4. 编译生成插件库** - 使用与 Qt 版本匹配的编译器(如 MSVC2017 对应 Qt 5.14.2)编译项目,生成动态库文件(如 `custombuttonplugin.dll` 或 `libcustombuttonplugin.so`)[^2][^4]。 --- #### **5. 安装插件到 Qt Designer** 将生成的插件文件复制到 Qt 的插件目录: - **Windows**:`<Qt安装路径>/plugins/designer` - **Linux**:`<Qt安装路径>/gcc_64/plugins/designer` 重启 Qt Designer 或 Qt Creator,即可在控件面板中找到自定义组件并直接拖放使用[^2]。 --- #### **6. 在项目中使用自定义组件** - 在代码中直接包含头文件并实例化: ```cpp #include "custombutton.h" CustomButton *btn = new CustomButton(this); ``` - 在 Qt Designer 中拖放后,生成的 UI 文件会自动包含组件信息。 --- ### **注意事项** 1. **编译器一致性**:插件必须与 Qt Designer 使用相同的编译器(如 MSVC2017)编译,否则无法加载。 2. **路径配置**:确保插件文件放置在正确的目录,并检查环境变量是否包含 Qt 插件路径。 3. **元对象系统**:自定义组件类必须包含 `Q_OBJECT` 宏,并运行 `qmake` 重新生成 MOC 文件。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值