【问题标题】:Get system username in Qt在 Qt 中获取系统用户名
【发布时间】:2014-12-20 13:30:45
【问题描述】:

在 Qt C++ 程序中是否有任何跨平台方式来获取当前用户名?

我已经爬取了互联网和解决方案的文档,但我唯一找到的是依赖于操作系统的系统调用。

【问题讨论】:

    标签: c++ qt qtcore


    【解决方案1】:

    你也可以像这样使用QProcessEnvironment

    QProcessEnvironmentenv = QProcessEnvironment::systemEnviroment();
    QString username = env.value("USER");
    

    【讨论】:

      【解决方案2】:

      您可以使用qEnvironmentVariable

      QString sysUsername = qEnvironmentVariable("USER");
      if (sysUsername.isEmpty()) sysUsername = qEnvironmentVariable("USERNAME");
      

      【讨论】:

        【解决方案3】:

        有一种方法可以使用 Qt 获取当前的 windows 用户名。在这里

        ma​​inwindow.ui This is the form ui

        ma​​inwindow.cpp

        #include "mainwindow.h"
        #include "ui_mainwindow.h"
        #include <QProcess>
        #include <QDir>
        
        MainWindow::MainWindow(QWidget *parent) :
            QMainWindow(parent),
            ui(new Ui::MainWindow)
        {
            ui->setupUi(this);
            this->getUser();
        }
        
        MainWindow::~MainWindow()
        {
            delete ui;
        }
        
        void MainWindow::getUser()
        {
            QProcess *username = new QProcess();
            QStringList cmdParamaters, split;
            QString clean1, clean2, clean3,userName;
            int cutOff, strLen;
        
            cmdParamaters << "/c"<<"\"%USERPROFILE%\"";
            username->setProcessChannelMode(QProcess::MergedChannels);
            username->start("cmd.exe",cmdParamaters);
            username->waitForFinished();
        
            QString vusername (username->readAllStandardOutput());
            cutOff = vusername.indexOf("'", 1);
            ui->label_2->setText(vusername);
        
            clean1 = vusername.left(cutOff);
            ui->label_3->setText(clean1);
        
            clean2 = clean1.remove(0,3);
            strLen = clean2.length();
            ui->label_4->setText(clean2);
        
            clean3 = clean2.left(strLen-2);
            split = clean3.split("\\");
        
            userName = split[2]; //This is the current system username
            ui->label_5->setText(userName);
            delete username;
        }
        

        输出: Code output

        【讨论】:

          【解决方案4】:

          在 QT5 及更高版本中,可以执行以下操作:

          QString userName = QDir::home().dirName();
          

          `QDir::home() 返回用户的主目录。

          【讨论】:

          • 重要的是要注意用户主目录并不总是与用户名相同。
          【解决方案5】:

          几天前我实际上正在考虑它,我得出的结论是有不同的选择,每个选择都有自己的权衡,即:

          环境变量使用qgetenv

          此解决方案的优势在于它非常易于实施。缺点是如果环境变量设置为别的,那么这个方案就完全不可靠了。

          #include <QString>
          #include <QDebug>
          
          int main()
          {
              QString name = qgetenv("USER");
              if (name.isEmpty())
                  name = qgetenv("USERNAME");
              qDebug() << name;
              return 0;
          }
          

          QStandardPaths 的家庭位置

          优点是,它相对容易实现,但话又说回来,它很容易变得不可靠,因为在用户主位置使用不同的用户名和“条目”是有效的。

          #include <QStandardPaths>
          #include <QStringList>
          #include <QDebug>
          #include <QDir>
          
          int main()
          {
              QStringList homePath = QStandardPaths::standardLocations(QStandardPaths::HomeLocation);
              qDebug() << homePath.first().split(QDir::separator()).last();
              return 0;
          }
          

          运行外部进程并使用特定于平台的 API

          这可能是最难实现的,但另一方面,这似乎是最可靠的,因为它不能像使用环境变量或家庭位置技巧那样在应用程序下如此容易地更改。在 Linux 上,您将使用 QProcess 来调用通常的 whoami command,而在 Windows 上,您将使用 GetUserName WinAPI 来实现此目的。

          #include <QCoreApplication>
          #include <QProcess>
          #include <QDebug>
          
          int main(int argc, char **argv)
          {
          // Strictly pseudo code!
          #ifdef Q_OS_WIN
              char acUserName[MAX_USERNAME];
              DWORD nUserName = sizeof(acUserName);
              if (GetUserName(acUserName, &nUserName))
                  qDebug << acUserName;
              return 0;
          #elif Q_OS_UNIX
              QCoreApplication coreApplication(argc, argv);
              QProcess process;
              QObject::connect(&process, &QProcess::finished, [&coreApplication, &process](int exitCode, QProcess::ExitStatus exitStatus) {
                  qDebug() << process.readAllStandardOutput();
                  coreApplication.quit();
              });
              process.start("whoami");
              return coreApplication.exec();
          #endif
          }
          

          总结:我个人会选择最后一个变体,因为尽管它最难实现,但它是最可靠的。

          【讨论】:

          • 你的第一个“if”是大写的。
          • 我没有投反对票,我尝试编辑,但编辑太短了,SOF 不接受。我真的很喜欢你的回答,谢谢。
          • @migas:谢谢,我的回答最初被否决为-1,我只是不明白为什么当我尽最大努力回答它时,恕我直言。不过,这对 SO 来说是有用的知识。谢谢你问。 :-)
          • 脱帽致敬,超出我的要求。由于我的程序的性质和它将在其中运行的受控环境,我将选择qgetenv 选项,因为它很简单。恕我直言,家庭环境的选项实际上不是一个选项,因为家庭是心脏所在的地方(或用户定义的地方)。但是对于答案的质量,它绝对是被认可的。作为记录,我既没有测试第二个解决方案也没有测试第三个解决方案,但它们肯定看起来是合法的。
          • @migas:在最后一个例子中,finished() 信号遗憾地需要明确的重载解决方案,但我将把它留给读者作为手指练习。 :-)
          【解决方案6】:

          Qt 无法获取当前用户名。

          但是,您可以阅读以下链接:

          http://www.qtcentre.org/threads/12965-Get-user-name http://qt-project.org/forums/viewthread/11951

          我认为最好的方法是:

          #include <stdlib.h>
          
          getenv("USER"); ///for MAc or Linux
          getenv("USERNAME"); //for windows
          

          编辑:您可以使用qgetenv 而不是getenv

          【讨论】:

          • 如果我要使用环境变量,我想我更喜欢使用qgetenv,因为这是 Qt 的方式。
          • @migas:不仅如此,它也不可靠。
          • 我认为qgetenv 也比getenv 好。 :)
          猜你喜欢
          • 2013-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-27
          • 1970-01-01
          • 1970-01-01
          • 2011-04-24
          • 1970-01-01
          相关资源
          最近更新 更多