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));
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • OpenCV学习笔记(30)KAZE 算法原理与源码分析(四)KAZE特征的性能分析与比较

    OpenCV学习笔记(30)KAZE 算法原理与源码分析(四)KAZE特征的性能分析与比较KAZE系列笔记:1. OpenCV学习笔记(27)KAZE算法原理与源码分析(一)非线性扩散滤波2. OpenCV学习笔记(28)KAZE算法原理与源码分析(二)非线性尺度空间构建3. OpenCV学习笔记(29)KAZE算法原理与源码分析(三)特征检测与描述4. OpenCV学习笔记(30)KAZE算法原理与源码分析(四)KAZE特征的性能分析与比较5. OpenCV学习笔记

  • plugins webpack_webpack实现原理

    plugins webpack_webpack实现原理plugin插件是webpack的支柱功能。webpack自身也是构建于你在webpack配置中用到的相同的插件系统之上!插件目的在于解决loader无法实现的其他事。常用的插件

  • Mac下SVN基本操作和常见错误

    Mac下SVN基本操作和常见错误

    2021年10月20日
  • Lintcode 1667.石头

    Lintcode 1667.石头题目大意:一条直线上有n个石头,一个人从左往右走,碰到奇数块石头(碰到一块石头数一个数,这里指数的数是奇数),就往右扔,碰到偶数的石头就不管他,如果两块石头在同一个位置,就扔大的那块(能扔的距离小的)。问最后最远的那块石头的位置。思路:用优先队列模拟,每遇到奇数石头,就将其坐标加上D[i],放回优先队列,当石头重叠时,先扔投大的(能扔的距离小的),故在比较函数中,以位置为第一关键字,以投掷距离…

  • linux 进入编辑文件,保存退出相关命令「建议收藏」

    linux 进入编辑文件,保存退出相关命令「建议收藏」1.进入文件vim文件名(vimtest.txt)2.编辑完成之后,按ESC键跳到命令模式(命令前面冒号是必要的):  :w保存文件但不退出vi  :wfile将修改另外保存到file中,不退出vi  :w!强制保存,不推出vi  :wq保存文件并退出vi  :wq!强制保存文件,并退出vi  :q不保存文件,退出vi…

  • 研招网的准考证还能下载吗_考研准考证还能下载吗

    研招网的准考证还能下载吗_考研准考证还能下载吗下载打印方式往下看,有手把手教学。【考生请注意】据了解,《准考证》由考生使用A4幅面白纸在规定时间内(2021年12月10日开始至12月27日)上网自行下载打印。《准考证》正、反两面在使用期间均不得涂改或书写。考生凭下载打印的《准考证》及居民身份证参加考研初试和复试。考生凭本人《准考证》及有效居民身份证按规定时间进入考场,对号入座。入座后将上述证件放在桌面左上角,以便核验。请考生下载《准考证》前认真阅读报考点所在地省(区、市)考生防疫有关要求,并认真关注《准考证》上“省级招生考试…

发表回复

您的电子邮箱地址不会被公开。

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