Qt下 QString转char* 的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zzwdkxx/article/details/37991583

char* MenuButton::getTextStr(QString string)
{
    QString str = string;

    char* text = NULL;
    QByteArray ba = string.toLatin1();
    //text = ba.data();      // ba是个局部变量,用完就析构了,所以后面再取text就出现乱码
    text = strdup(ba.data()); //直接拷贝出来就不会乱码了
    return text; 
}

代码中用了上述部分,将QString转换为char*,发现显示结果为乱码,原因就是局部变量的问题,如上所述,ba被析构了。但是,这里有个问题:

strdup的工作原理:
char * __strdup (const char *s)
{
size_t len =strlen (s) + 1;
void *new =malloc (len);
if (new == NULL)
return NULL;
return (char *)memcpy (new, s, len);
}

就是说,strdup()主要是拷贝字符串s的一个副本,由函数返回值返回,这个副本有自己的内存空间,和s不相干。strdup函数复制一个字符串,使用完后要记得删除在函数中动态申请的内存,strdup函数的参数不能为NULL,一旦为NULL,就会报段错误,因为该函数包括了strlen函数,而该函数参数不能是NULL。因此后面要考虑这个段内存的释放,可以在主程序申请一个buffer数组,将这段数据存放后,将原来对象free掉。

综上,

char* MenuButton::getTextStr(QString string)
{
    QString str = string;

    char* text = NULL;
    QByteArray ba = string.toLatin1();
    text = ba.data();      
    return text; // 这里text直接用没问题,最好不要return,上述strup的使用也不是很安全
}

再来考虑下面这个,有问题吗?


咨询了一个大牛,他说这里调用了setBrush,QPainter会对brush进行拷贝,因此不用担心上述那个局部变量析构的问题。


关于字符串的转换问题,附一篇博文,有待验证:http://www.cnblogs.com/renzongxian/archive/2013/06/09/3129208.html

Qt char*, string, int与QString型字符串的转换

(1)将QString转换为char *

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

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

方法如下:

1 Qstring str;
2 char* ch;
3 QByteArray ba = str.toLatin1();
4 ch=ba.data();

这样就完成了QString向char*的转化。经测试程序运行时不会出现bug

注意第三行,一定要加上,不可以str.toLatin1().data()这样一部完成,可能会出错。

补充:以上方法当QString里不含中文时,没有问题,但是QString内含有中文时,转换为char*就是乱码,采用如下方法解决:

  方法1:
  添加GBK编码支持:

1 #include <QTextCodec>
2 QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
3 QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));


然后改变上面的第三行为:QByteArray ba = str.toLoacl8Bit(); toLoacl8Bit支持中文

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

1 QString qstr;
2 std::string str = qstr.toStdString();//QString转换为string
3 const char* ch = str.c_str();
注意:c_str函数的返回值是const char*的,不能直接赋值给char*

(2)把char*转换为QString。
最为方便的做法是以一个QLatin1String对象作为参数,来调用QString的构造函数。
示例:

1 const char *cstr;
2 QString qstr= QString(QLatin1String(cstr));

(3)把string转换为QString.

1 std::string str="hello";
2 QString qstr = QString(QString::fromLocal8Bit(str.c_str()));//string向QString转换

(4)int(float)型转化为QString型

  方法一:

1 long a = 63;
2 QString s = QString::number(a, 10); // s == "63"
3 QString t = QString::number(a, 16).toUpper(); // t == "3F"

(解释,变量a为int型或者float,double。10和16为进制) toUpper是大写
  方法二:

1 long a = 63;
2 QString s = QString("%1").arg(a);

展开阅读全文

没有更多推荐了,返回首页