如何在Windows上将Qt QString转换为LPCTSTR

How to convert a Qt QString into an LPCTSTR on Windows

本文关键字:QString 转换 LPCTSTR Qt 上将 Windows      更新时间:2023-10-16

我试图打开注册表并修改它。这是我打开注册表的方式:

HKEY hKey;
LPCTSTR subKey = TEXT("a registry subkey to be opened");
RegOpenKeyEx(HKEY_LOCAL_MACHINE, subKey, 0, KEY_ALL_ACCESS , &hKey);

但是这里有一个问题,我想用QString务实地更改子键。并像这样放置QString

QString subKeyString = QString("%1").arg(subKeyName);
LPCTSTR subKey = TEXT(subKeyString); //but it's not working here

我以为这是因为我没有将QString更改为LPCTSTR,我尝试了这个解决方案,但仍然想不出将自定义QString放入TEXT宏的方法。我不太确定引擎盖下的WinApi,我只是尝试了我能做的事情。

有没有办法解决这个问题?

编辑:
这是我如何将QString转换为LPCTSTR

QString testString = "converting QString to LPCSTR";
QByteArray testStringArr = testString.toLocal8Bit();
LPCSTR lp = LPCSTR(testStringArr.constData()); //the QString is converted to LPCTSTR
//but when I put the LPCSTR to the TEXT macro, the error is still there, like the next line below will not complie
LPCSTR lp = TEXT(LPCSTR(testStringArr.constData())); //This line will not work

TEXT()宏仅适用于编译时文本,不适用于运行时数据。TCHAR和相关API旨在帮助人们将代码从基于ANSI的Win9x/ME迁移到基于Unicode的WinNT 4+,方法是在charwchar_t之间映射文本,并在AW变体之间映射函数名称。但那些日子早已一去不复返了。

在这种情况下,正确的解决方案是完全忽略TCHAR,只关注 Unicode。QString是 Unicode 字符串的包装器。因此,仅使用基于 Unicode 的注册表 API 函数,并假装TCHAR不存在。

在 Windows 上,基于 Unicode 的 API 需要 UTF-16 编码的wchar_t字符串。使用QString::toStdWString()方法获取std::wstring,它是wchar_t字符串的C++包装器:

QString subKeyString = QString("%1").arg(subKeyName);
std::wstring subKey = subKeyString.toStdWString();
HKEY hKey;
RegOpenKeyExW(HKEY_LOCAL_MACHINE, subKey.c_str(), 0, KEY_ALL_ACCESS, &hKey);

或者,您可以使用QString::utf16()方法。 但是,它返回一个const ushort*指针,因此您必须将其类型转换为const wchar_t*

QString subKeyString = QString("%1").arg(subKeyName);
LPCWSTR subKey = reinterpret_cast<LPCWSTR>(subKeyString.utf16());
HKEY hKey;
RegOpenKeyExW(HKEY_LOCAL_MACHINE, subKey, 0, KEY_ALL_ACCESS, &hKey);

>TEXT宏应该有助于维护应用程序的非Unicode和Unicode版本。 取决于是否定义了_UNICODE(或UNICODE,不记得了(。TEXT("foo")将扩展到L"foo"或仅"foo"。同样,CreateWindow要么是采用WCHAR*参数的CreateWindowW,要么是采用CHAR*参数的CreateWindowA

考虑到现在是2018年,我建议您忘记该应用程序TEXT宏和非Unicode版本。QString::utf16()将返回 WinAPI 所需的 UTF16 字符串。如果使用"本机wchar_t"编译器设置进行编译,则需要将utf16()返回的内容转换为WCHAR*。如果"本机wchar_t"已关闭,它将按原样工作。

我参加聚会可能有点晚了,但要建立在另外两个答案的基础上,像这样简单的事情会给车轮加油:

inline const WCHAR *QStoWCHAR (const QString& qs)
{
return (const WCHAR *) qs.utf16 ();
}

然后你可以做(例如(:

RegOpenKeyExW (HKEY_LOCAL_MACHINE, QStoWCHAR (my_qstring), 0, KEY_ALL_ACCESS, &hKey);