鱼C论坛

 找回密码
 立即注册
查看: 68|回复: 2

QT怎么获取实时的电脑的账户名

[复制链接]
发表于 昨天 17:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
void TCPClient::InitHostInfo()
{
                //m_username = QString::fromLocal8Bit(qgetenv("USERNAME")).toStdString();
#ifdef _WIN32
                // 使用 Windows API 获取实时账户名
                TCHAR username[UNLEN + 1];
                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,这个是为什么?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 17:12 | 显示全部楼层
在Qt中获取实时电脑账户名,可以使用Windows API或跨平台方法。以下是修正后的代码(支持Windows和Linux/macOS):

  1. #include <QString>
  2. #include <iostream>

  3. #ifdef Q_OS_WIN
  4. #include <windows.h> // Windows头文件
  5. #include <Lmcons.h>  // 需要UNLEN常量
  6. #else
  7. #include <unistd.h> // Unix-like系统头文件
  8. #include <pwd.h>
  9. #endif

  10. void TCPClient::InitHostInfo()
  11. {
  12. #ifdef Q_OS_WIN
  13.     // Windows方案
  14.     wchar_t username[UNLEN + 1];
  15.     DWORD username_len = UNLEN + 1;
  16.     if (GetUserNameW(username, &username_len)) {
  17.         m_username = QString::fromWCharArray(username).toStdString();
  18.     } else {
  19.         m_username = "UnknownUser";
  20.     }
  21. #else
  22.     // Linux/macOS方案
  23.     struct passwd *pwd = getpwuid(geteuid());
  24.     if (pwd) {
  25.         m_username = QString(pwd->pw_name).toStdString();
  26.     } else {
  27.         m_username = "UnknownUser";
  28.     }
  29. #endif
  30.     std::cout << "Username: " << m_username << std::endl;
  31. }
复制代码


关键说明:
1. Windows修正:
   - 将 `TCHAR username` 改为宽字符数组 `wchar_t username[UNLEN + 1]`
   - 使用 `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 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 小时前 | 显示全部楼层
如果你需要“账户名”,你目前的代码没问题,获取的就是账户名。

如果你需要“计算机名”,请用 QHostInfo::localHostName() 或 GetComputerName()。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-14 18:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表