QString 和 TCHAR 的相互转换

参考资料:

 

http://www.cnblogs.com/fuyanwen/p/3200536.html
http://www.cnblogs.com/wendao/archive/2012/07/27/2612597.html

不能直接用:

QString szqFileName = QString::fromLocal8Bit("data");
const char* szName = szqFileName.toLocal8Bit().constData(); // 返回的 QByteArray 被析构掉了, szName 会指向无效的内存区

正确的做法:

QString szqFileName = QString::fromLocal8Bit("data");
QByteArray ba = szqFileName.toLocal8Bit();
const char* szName = ba.constData();

代码(在我的系统上, Win7 x64. CHS. 第21, 40行如果我用utf8的话就会乱码), 下载DEMO:

注: 关于UNICODE宏的设置

 1 #include <iostream>
 2 
 3 #include <Windows.h>
 4 #include <QtCore/QtCore>
 5 
 6 #ifdef UNICODE
 7 #define FILE_NAME "数据.txt"
 8 #else
 9 #define FILE_NAME "data.txt"
10 #endif
11 
12 int main()
13 {
14     QString szqFileName = QString::fromLocal8Bit(FILE_NAME);
15     qint64 nLen = szqFileName.length();
16     //
17     // QString to TCHAR*
18     //
19     LPCTSTR szFileName = NULL;
20 #ifdef UNICODE
21     szFileName = (wchar_t*)szqFileName.utf16();
22 #else
23     QByteArray byteArray = szqFileName.toLocal8Bit();
24     szFileName = byteArray.constData();
25 #endif // UNICODE
26     //
27     // Create file
28     //
29     HANDLE hFile = ::CreateFile(szFileName, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
30     if (hFile == INVALID_HANDLE_VALUE)
31         std::cout << "Cannot create file." << std::endl;
32     else
33         std::cout << "File created." << std::endl;
34     ::CloseHandle(hFile);
35     //
36     // TCHAR* to QString
37     //
38     szFileName = TEXT(FILE_NAME);
39 #ifdef UNICODE
40     szqFileName = QString::fromUtf16((ushort*)szFileName);
41 #else
42     szqFileName = QString::fromLocal8Bit(szFileName);
43 #endif
44     QFile file(szqFileName);
45     if (!file.remove())
46         std::cout << "Cannot remove file." << std::endl;
47     else
48         std::cout << "File removed." << std::endl;
49     
50     return 0;
51 }

 

posted @ 2015-11-17 22:28  rldts  阅读(5560)  评论(0编辑  收藏  举报