• QT中QString 转换为 char *的几种方法


    Qt下 QString转char* 的问题

    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
    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);
     

    1.QString 转换为 char *

    将 QString 转 char *,需要用到 QByteArray 类,QByteArray 类的说明详见 Qt 帮助文档。
    因为 char * 最后都有一个'\0'作为结束符,而采用 QString::toLatin1() 时会在字符串后面加上'\0'。

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

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

    方法1:添加GBK支持

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

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

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

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

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

    2.char * 转换为 QString

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

    QString(const QLatin1String &str);
    

    QLatin1String 的构造函数:

    QLatin1String(const char *str);
    

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

    str = QString(QLatin1String(ch));

    char * 与 const char *的转换

    1. char *ch1="hello11";
    2. const char *ch2="hello22";
    3. ch2 = ch1;//不报错,但有警告
    4. ch1 = (char *)ch2;

    char 与 QString的转换

    char 转换为 QString 
    其实方法有很多中,我用的是:

    1. char a='b';
    2. QString str;
    3. str=QString(a);

    QString 转换为 char 
    方法也有很多种

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

    注意:在调用QByteArray.data()之前,必须要先显示储存这个bytearray。像这样const char *ch = str.toLatin1().data();会使程序崩溃,因为QByteArray没有被储存,调用data()前是不存在的,必须先显式调用一次toLatin1(),再调用data()。

    QByteArray 与 char* 的转换

    QByteArray 转换为 char *

    1. char *ch;//不要定义成ch[n];
    2. QByteArray byte;
    3. ch = byte.data();

    char * 转换为 QByteArray

    1. char *ch;
    2. QByteArray byte;
    3. byte = QByteArray(ch);

    QString 与 QByteArray 的转换

    QString转换为QByteArray

    1. QByteArray byte;
    2. QString string;
    3. byte = string.toAscii();

    QByteArray 转换为 QString

    1. QByteArray byte;
    2. QString string;
    3. string = QString(byte);

    这里再对这俩中类型的输出总结一下:

    1. qDebug()<<"print";
    2. qDebug()<<tr("print");
    3. qDebug()<
    4. qDebug()<<tr(ch);
    5. qDebug()<
    6. qDebug()<<tr(byteArray);
    7. qDebug()<

    但是qDebug()<是不可以的,要想用tr()函数输出QString类型的字符则要如下:

    qDebug()<<tr(str.toLatin1);

    int与 QString 的转换

    int 转 QString

    1. int a=10;
    2. QString b;
    3. b=QString::number(a)

    QString 转int

    1. QString a="120"
    2. int b;
    3. b=a.toInt()

    QString与string的转换

    QString –> string

    1. QString.toStdString();
    2. string --> QString
    3. QString::fromStdString(string)

    QString与其他类型的转换

    QString —>int,double,char *

    1. QString::toInt()
    2. QString::toDouble()
    3. QString.toStdString().c_str();

    int double char* —>string 
    可以采用里的stringstream

    以int 为例,

    1. int a = 3;
    2. stringstream ss;
    3. string strInt;
    4. ss<<a;
    5. ss>>strInt;

    QString—>QDateTime 
    QDateTime转QString

    1. public QDateTime qdate = QDateTime.currentDateTime();
    2. datetime = qdate.toString("yyyy年MM月dd日ddddhh:mm:ss");
    3. //201203月-05日Monday13:48:55
    4. QString转换成QDateTime
    5. QDateTime dateTime2 = QDateTime::fromString("M1d1y9800:01:02","'M'M'd'd'y'yyhh:mm:ss");

    QString –>Char*

    Qstring 转换char*问题! 
    方法一:

    1. QString qstr("hello,word");
    2. const char * p = qstr.toLocal8Bit().data();

    方法二:

    1. const char *p = qstr.toStdString().data();
    2. //转换过来的是常量

    方法三:

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

    或者

    1. QString tmp = "test";
    2. QByteArray text = tmp.toLocal8Bit();
    3. char *data = new char[text.size() + 1]
    4. strcpy(data, text.data());
    5. delete [] data;

    QDateTime 转换为 QString

    1. QString strBuffer;
    2. QDateTime time;
    3. time = QDateTime::currentDateTime();
    4. strBuffer = time.toString("yyyy-MM-dd hh:mm:ss");
    5. // strBuffer = 2015-12-21 17:35:00

    String 转换为 QDateTime

    1. QString strBuffer;
    2. QDateTime time;
    3. strBuffer = "2010-07-02 17:35:00";
    4. time = QDateTime::fromString(strBuffer, "yyyy-MM-dd hh:mm:ss");

  • 相关阅读:
    Java集合常见面试题
    python的多线程介绍之thread
    SiC器件概念
    Hbase
    qt人员管理模块(模块化程序)功能块复制直接使用不冲突
    【pytest】 pytest拓展功能 pycharm PermissionError: [Errno 13] Permission denied:
    day10-内核实验项目概述与内核信号
    SAP UI5 应用开发教程之一百零二 - SAP UI5 应用的打印(Print)功能实现详解
    Kubernetes容器运行时:Containerd vs Docke
    上游服务不可用了,下游服务如何应对?
  • 原文地址:https://blog.csdn.net/u011555996/article/details/127942482