zl程序教程

您现在的位置是:首页 >  工具

当前栏目

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

Qt转换方法 几种 char QString
2023-09-11 14:16:44 时间

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

1.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();

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 *的转换

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

char 与 QString的转换

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

char a='b';
QString str;
str=QString(a);

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

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

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

QByteArray 与 char* 的转换

QByteArray 转换为 char *

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

char * 转换为 QByteArray

char *ch;
QByteArray byte;
byte = QByteArray(ch);

QString 与 QByteArray 的转换

QString转换为QByteArray

QByteArray byte;
QString string;
byte = string.toAscii();

QByteArray 转换为 QString

QByteArray byte;
QString string;
string = QString(byte);

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

qDebug()<<"print";
qDebug()<<tr("print");
qDebug()<<ch;(ch 为char类型)
qDebug()<<tr(ch);
qDebug()<<byteArray;(byteArray是QByteArray类型)
qDebug()<<tr(byteArray);
qDebug()<<str;(str 为Qstring类型)

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

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

int与 QString 的转换

int 转 QString

int a=10;
QString b;
b=QString::number(a)

QString 转int

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

QString与string的转换

QString –> string

QString.toStdString();
string --> QString
QString::fromStdString(string)

QString与其他类型的转换

QString —>int,double,char *

QString::toInt()
QString::toDouble()
QString.toStdString().c_str();

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

以int 为例,

int a = 3;
stringstream ss;
string strInt;
ss<<a;
ss>>strInt;

QString—>QDateTime 
QDateTime转QString

public QDateTime qdate = QDateTime.currentDateTime();  
datetime = qdate.toString("yyyy年MM月dd日ddddhh:mm:ss");  
//2012年03月-05日Monday13:48:55  

QString转换成QDateTime  

QDateTime dateTime2 = QDateTime::fromString("M1d1y9800:01:02","'M'M'd'd'y'yyhh:mm:ss");  

QString –>Char*

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

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

方法二:

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

方法三:

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

或者

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

QDateTime 转换为 QString

QString strBuffer;  
QDateTime time;  

time = QDateTime::currentDateTime();  

strBuffer = time.toString("yyyy-MM-dd hh:mm:ss");  

// strBuffer = 2015-12-21 17:35:00  

String 转换为 QDateTime

QString strBuffer;  
QDateTime time;  

strBuffer = "2010-07-02 17:35:00";  

time = QDateTime::fromString(strBuffer, "yyyy-MM-dd hh:mm:ss");