1.QString转char *
如果QString没有中文,那么先将QString转换为std::string,再将std::string转换为char *。
如果QString有中文,那么先将QString转换为std::wstring,再将std::wstring转换为char *。
bool draw::read(const QString &path)//path是带有中文字符的 { //Qt获取环境变量中的TEMP目录;C:\Users\firecat\AppData\Local\Temp; QString pathTemp = QStandardPaths::writableLocation(QStandardPaths::TempLocation); pathTemp += "\\tmp.dxf"; std::string out = pathTemp.toStdString(); std::wstring in = path.toStdWString(); const char *outdxf = out.data(); char *infile = wcharToChar(in.data()); std::cout << outdxf << endl; std::cout << infile << endl; delete infile; } char *draw::wcharToChar(const wchar_t *wstr) { if (!wstr || wstr == NULL) { return NULL; } unsigned int len = WideCharToMultiByte(CP_ACP, 0, wstr, wcslen(wstr) + 1, NULL, 0, NULL, NULL); char *cchar = new char[len]; //这里new,外部记得要释放内存 memset(cchar, 0, len); WideCharToMultiByte(CP_ACP, 0, wstr, wcslen(wstr) + 1, cchar, len, NULL, NULL); return cchar; } wchar_t *draw::charToWchar(const char *str) { if (!str || str == NULL) { return NULL; } unsigned int len = MultiByteToWideChar(CP_ACP, 0, str, strlen(str) + 1, NULL, 0); wchar_t *tchar = new wchar_t[len + 1]; //这里new,外部记得要释放内存 memset(tchar, '\0', len + 1); MultiByteToWideChar(CP_ACP, 0, str, strlen(str) + 1, &tchar[0], len); return &tchar[0];
2. char * 转QString
可以使用QString的构造函数进行转换:QString(const QLatin1String &str);
QLatin1String的构造函数:QLatin1String(const char *str);
则如下语句是将char * mm转换为QString str:
str = QString(QLatin1String(mm));
3.std::string转QString
QString s = QString::fromStdString()
double d = 0.123456;
QString info = QString::asprintf("%.3f", d);
x.网上看到了其他方法,也有先将QString转换为QByteArray,再将QByteArray转换为char *的方法,来看例子。
注意:不能用下面的转换形式char *mm = str.toLatin1().data();。因为这样的话,str.toLatin1()得到的QByteArray类型结果就不能保存,最后转换,mm的值就为空。
//#include "myclass.h" #include <QtGui/QApplication> #include <QtDebug> #include <QString> int main(int argc, char *argv[]) { QApplication a(argc, argv); QString str = "hello"; //QString转char * QByteArray ba = str.toLatin1(); char *mm = ba.data(); qDebug()<<mm<<endl; //调试时,在console中输出 QString nn = QString(QLatin1String(mm)); //char *转QString qDebug()<<nn<<endl; //调试时,在console中输出 //MyClass w; //w.show(); return a.exec();
该方法,本人实测发现不能支持中文,中文会显示乱码。即QString内容包含中文时,转换char*会失败。
/*不可行,中文乱码 char cpath[MAX_PATH]; QByteArray ba = path.toLocal8Bit(); memcpy(cpath, ba.data(), ba.size() + 1); //加1是为了最后的终结符,否则转换回来的时候不知道什么时候截止 char *infile2 = cpath; std::cout << infile2 << endl;*/
*******************************************
QString和QByteArray提供了非常便利的operator+,以允许你写这样的代码:
QString directory = /*...*/, name = /*...*/;
QString dataFile = directory + QLatin1Char('/') + name + QLatin1String(".dat");
**********************************************/
---
姊妹篇:
string和wstring之间转换的三种方法
https://libaineu2004.blog.csdn.net/article/details/119393505