QString转char*、string、const char*

QString转char*

QString a = "test";
QByteArray ba;
ba = a.toLatin1();
char * ch = ba.data();

该过程可以完成QString到char*的转换,但是不能写成char * ch = a.toLatin1().data(),这是因为QByteArray::data()的返回值是存在于QByteArray中的,也就是说a.toLatin1().data()执行的情况是,char*被返回的同时,QString::toLatin1()所返回的QByteArray占用内存就被释放了,char*所指向的地址中的值随QByteArray的析构函数执行被清除,导致char*指向地址数据不正确。

使用下面两端代码对上述情况进行解释:

1.char*指向内存随析构函数执行被修改

/*
该函数传入一个QString,执行过程如下
1.新建一个QByteArray对象ba,分配内存空间,执行默认构造函数
2.使用QString类型的text通过toLatin1()给ba拷贝赋值
3.char*类型的ch指向ba.data()返回的地址空间的首地址
4.返回ch
5.函数执行结束,临时变量执行析构函数回收内存空,ba内存被释放,ch指向的地址数据被清除,ch返回无效值
*/
char * t_QString2CharArray(QString text)
{
	QByteArray ba;
	ba = text.toLatin1();
	char * ch = ba.data();
	return ch;
}

2.char*返回正确结果但要求马上被使用

/*
该函数和上面的差别在一把临时变量ba变成了static变量,也就是ba不会随函数执行结束释放内存(当然,你也可以设置成相对生命周期更长的局部变量或全局变量)
这样在转换后可以得到正确结果,但是需要被马上使用,否则该函数第二次被调用时数据同样会被修改
而返回的char*也只能通过值传递进行使用,不能传引用,如果传引用使用最终都会变成最后一次调用该函数返回的结果
*/
static QByteArray ba;
char * t_QString2CharArray(QString text)
{
	ba = text.toLatin1();
	char * ch = ba.data();
	return ch;
}

QString转const char*

如果能转换成char*,转const char*应该是可以很容易通过char*转换的,但是这里必须单独提出对QString到const char*的转换就在于Qt对中文的支持

如果QString是QStringLiteral("测试")这样的中文字符串,使用上面的QString转char*你会发现转换出来全是乱码,但是QString通过转为string可以支持中文(我也不知道为什么),而大多数开源库的传参都不会用string,基本都是char*或const char*,因此还需要把string转为const char*来使用

QString a = QStringLiteral("测试");
std::string str = a.toStdString();
const char * ch_filtername = str.c_str();

通过上面的一段代码就可以得到由QString转来的字符串啦,并且对中文是支持的,至于要写成函数的形式的话,参照上面同样去测试就好了。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值