在Qt中获取系统用户名

时间:2014-10-24 16:46:03

标签: c++ qt qtcore

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

我已经抓取了互联网和解决方案的文档,但我发现的唯一的事情是依赖于操作系统的系统调用。

6 个答案:

答案 0 :(得分:36)

我实际上是在几天前考虑过这个问题,而且我得出了不同的选择,每个都有自己的权衡,即:

使用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
}

摘要:我个人会选择最后一个版本,因为即使它是最难实现的,也是最可靠的。

答案 1 :(得分:4)

无法使用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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:0)

有一种方法可以使用Qt获取当前的Windows用户名。这是

<强> mainwindow.ui This is the form ui

<强> mainwindow.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 :(得分:0)

您可以使用qEnvironmentVariable

lastRet

答案 5 :(得分:0)

您还可以像这样使用QProcessEnvironment

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