QT怎么获取实时的电脑的账户名
void TCPClient::InitHostInfo(){
//m_username = QString::fromLocal8Bit(qgetenv("USERNAME")).toStdString();
#ifdef _WIN32
// 使用 Windows API 获取实时账户名
TCHAR username;
DWORD username_len = UNLEN + 1;
if (GetUserName(username, &username_len)) {
m_username = QString::fromWCharArray(username).toStdString();
}
std::cout << "电脑名称: " << m_username << std::endl;
#else
m_username = qgetenv("USER").toStdString();
#endif
m_osVersion = QSysInfo::prettyProductName().toStdString();
//m_username = getCurrentUserName().toStdString();
const QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();
for (const QNetworkInterface& netInterface : interfaces) {
// 跳过虚拟网卡、未启用网卡、环回网卡
if (!(netInterface.flags() & QNetworkInterface::IsUp) || !(netInterface.flags() & QNetworkInterface::IsRunning) || (netInterface.flags() & QNetworkInterface::IsLoopBack) ||
netInterface.humanReadableName().contains("VMware", Qt::CaseInsensitive) ||
netInterface.humanReadableName().contains("VirtualBox", Qt::CaseInsensitive))
{
continue;
}
const QList<QNetworkAddressEntry> entries = netInterface.addressEntries();
for (const QNetworkAddressEntry& entry : entries) {
QHostAddress ip = entry.ip();
if (ip.protocol() == QAbstractSocket::IPv4Protocol &&
!ip.isLoopback() &&
!ip.toString().startsWith("169.254"))// 排除自动私有地址
{
m_ipAddress = ip.toString().toStdString();
m_macAddress = netInterface.hardwareAddress().toStdString();
return;
}
}
}
}
这个函数开头是获取账户名的代码,但是现在的问题是原来的账户名是PC,不管我怎么改名字,获取的始终是PC,这个是为什么? 在Qt中获取实时电脑账户名,可以使用Windows API或跨平台方法。以下是修正后的代码(支持Windows和Linux/macOS):
#include <QString>
#include <iostream>
#ifdef Q_OS_WIN
#include <windows.h> // Windows头文件
#include <Lmcons.h>// 需要UNLEN常量
#else
#include <unistd.h> // Unix-like系统头文件
#include <pwd.h>
#endif
void TCPClient::InitHostInfo()
{
#ifdef Q_OS_WIN
// Windows方案
wchar_t username;
DWORD username_len = UNLEN + 1;
if (GetUserNameW(username, &username_len)) {
m_username = QString::fromWCharArray(username).toStdString();
} else {
m_username = "UnknownUser";
}
#else
// Linux/macOS方案
struct passwd *pwd = getpwuid(geteuid());
if (pwd) {
m_username = QString(pwd->pw_name).toStdString();
} else {
m_username = "UnknownUser";
}
#endif
std::cout << "Username: " << m_username << std::endl;
}
关键说明:
1. Windows修正:
- 将 `TCHAR username` 改为宽字符数组 `wchar_t username`
- 使用 `GetUserNameW` 避免编码问题
- 添加错误处理默认值
2. 跨平台支持:
- `#ifdef Q_OS_WIN` 自动识别系统
- Linux/macOS通过 `getpwuid(geteuid())` 获取账户名
3. 需包含的库:
- Windows:自动链接 `Advapi32.lib`
- Unix-like:无需额外库
4. 注意事项:
- 在.pro文件中添加:`win32: LIBS += -ladvapi32`
- 环境变量方式(如qgetenv("USER"))不可靠,不推荐使用
建议:
优先使用此跨平台方案,避免环境变量获取导致的权限问题。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 如果你需要“账户名”,你目前的代码没问题,获取的就是账户名。
如果你需要“计算机名”,请用 QHostInfo::localHostName() 或 GetComputerName()。 小甲鱼的二师兄 发表于 2025-6-14 14:24
如果你需要“账户名”,你目前的代码没问题,获取的就是账户名。
如果你需要“计算机名”,请用 QHostIn ...
但是我修改账户名的话就获取不到新的名字,永远都是PC
页:
[1]