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转来的字符串啦,并且对中文是支持的,至于要写成函数的形式的话,参照上面同样去测试就好了。

你可能感兴趣的:(Qt)