如何在Windows上将Qt QString转换为LPCTSTR
How to convert a Qt QString into an LPCTSTR on Windows
我试图打开注册表并修改它。这是我打开注册表的方式:
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+,方法是在char
和wchar_t
之间映射文本,并在A
和W
变体之间映射函数名称。但那些日子早已一去不复返了。
在这种情况下,正确的解决方案是完全忽略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);
- 将 hh:mm:ss.zzz 时间 QString 转换为毫秒的单行函数?
- 如何将包含指数的 QString 转换为C++中的双倍?
- 删除unicode def后,无法将QString转换为TCHAR
- 在Qt中将QString转换为ASCII值,反之亦然
- 如何在Windows上将Qt QString转换为LPCTSTR
- 将 QString 转换为 QJsonArray
- QByteArray 和 QString 转换的问题
- q致命参数:将 QString 转换为常量字符* 会导致警告"format string is not a string literal"
- 将QString转换为uintptr_t,qt / c
- 无法将 QString 转换为 Const Char*
- 处理字符到QString转换中的ASCII字符
- 将QString转换为QString的指针
- 使用 QList 将 Qstring 转换为双倍
- 将 QString 转换为 uint16*
- 将 QString 转换为无符号短整型
- 将十六进制 QString 转换为 UTF-8 QString
- 如何在 Visual Studio 2013 中将 Qt5 中的 QString 转换为 LPCSTR
- QString::compare() vs 将 QString 转换为数字然后进行比较
- 正在将QString转换为std::string
- 如何将QString转换为特定格式的QDate