QString与char *的相互转换

QString与char *的相互转换在进行编程时,我们经常需要用到字符串这种类型,毫无疑问,Qt库中也对字符串类型进行了封装,QString类提供了你能想到的所有字符串操作方法,给开发者带来了极大方便。  但是我们在编写程序时,不可避免地会在Qt框架上使用第三方的开源库,由于库的类型基本上都是标准的类型,即使用char*来表示字符串类型。那么问题来了,QString和char*之间如何进行转换呢?  下面分两

大家好,又见面了,我是你们的朋友全栈君。

在进行编程时,我们经常需要用到字符串这种类型,毫无疑问,Qt 库中也对字符串类型进行了封装,QString 类提供了你能想到的所有字符串操作方法,给开发者带来了极大方便。

但是我们在编写程序时,不可避免地会在 Qt 框架上使用第三方的开源库,由于库的类型基本上都是标准的类型,即使用 char * 来表示字符串类型。那么问题来了,QString 和 char * 之间如何进行转换呢?

下面分两种情况进行说明。

一、QString 转换为 char *

将 QString 转 char *,需要用到 QByteArray 类,QByteArray 类的说明详见 Qt 帮助文档。

因为 char * 最后都有一个'\0'作为结束符,而采用 QString::toLatin1() 时会在字符串后面加上'\0'

方法如下:

QString  str;
char*  ch;
QByteArray ba = str.toLatin1();	// must
ch=ba.data();

这样就完成了 QString 向 char * 的转化。经测试程序运行时不会出现 bug。注意第3行,一定要加上,不可以 str.toLatin1().data() 这样一步完成,否则可能会出错。
  
补充:以上方法当 QString 里不含中文时,没有问题,但是 QString 内含有中文时,转换为 char * 就是乱码,采用如下方法解决:

方法1:

添加GBK编码支持:

#include <QTextCodec>

QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));

然后将上面的第3行修改为:

QByteArray ba = str.toLocal8Bit();	// toLocal8Bit 支持中文

方法2:

先将 QString 转为标准库中的 string 类型,然后将 string 转为 char *。如下:

QString  filename;
std::string str = filename.toStdString();
const char* ch = str.c_str();

二、 char * 转换为 QString

将 char * 转换为 QString 比较容易操作,我们可以使用 QString 的构造函数进行转换:

QString(const QLatin1String &str);

QLatin1String 的构造函数:

QLatin1String(const char *str);

因此用下面这个语句就可以将 char * ch 转换为 QString str 了,如下:

str = QString(QLatin1String(ch));
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/144846.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 计算机机房安全设计规范,弱电机房建设规范要求

    计算机机房安全设计规范,弱电机房建设规范要求原标题:弱电机房建设规范要求工程中的数据中心机房建设是保证计算机网络设备和各级工作保障系统正常运转的关键。现在的计算机设备对运行环境要求较高。因此,必须按照一定的标准规范科学地设计机房。机房建设需要执行的标准主机房建设工程必须遵循国家机房设计标准规范的要求。场地要求计算机机房在多层建筑或高层建筑物内一般应设于第二、三层,水源充足,电力稳定可靠,应远离产生粉尘、油烟、有害气体以及贮存具有腐蚀性、易燃…

    2022年10月2日
    0
  • navicat15激活码最新【最新永久激活】

    (navicat15激活码最新)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html70YZDJVTFP-eyJsaWNlbnNlSW…

    2022年3月26日
    51
  • Ubuntu虚拟显示器_vmware安装ubuntu屏幕太小

    Ubuntu虚拟显示器_vmware安装ubuntu屏幕太小Ubuntu20.04虚拟显示器1080P配置一、背景二、配置方法1)安装软件2)添加配置文件3)重启三、效果Reference一、背景通过VNC远程连接Ubuntu系统电脑的图形化桌面时,如该电脑未连接显示器,需配置虚拟显示器。二、配置方法1)安装软件通过终端安装虚拟显示器软件。$sudoapt-getinstallxserver-xorg-core-hwe-18.04$sudoapt-getinstallxserver-xorg-video-dummy

    2022年8月21日
    7
  • java中的三元表达式_逻辑运算符两侧的数据类型

    java中的三元表达式_逻辑运算符两侧的数据类型一、分析当你使用三元运算符,两边的操作数的类型不一致的时候,这就涉及到三元操作符的转换规则:1.若果两个操作数不可转换,则不做转换,返回值为Object类型。2.若两个操作数是明确类型的表达式(比如变量),则按照正常的二进制数字来转换。int类型转换为long类型,long类型转换成float类型。3.若两个操作数中有一个是数字S,另外一个是表达式,且其类型为T,那

    2022年10月21日
    0
  • Hibernate查询方式之:HQL查询(需要使用的类是:Query)

    Hibernate查询方式之:HQL查询(需要使用的类是:Query)

    2021年7月10日
    75
  • 【转载】aspx,ascx和ashx使用小结

    【转载】aspx,ascx和ashx使用小结

    2021年11月21日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号