簡體   English   中英

在 Qt 中獲取系統用戶名

[英]Get system username in Qt

在 Qt C++ 程序中是否有任何跨平台的方式來獲取當前用戶名?

我已經在互聯網上搜索了解決方案的文檔,但我發現的唯一內容是依賴於操作系統的系統調用。

幾天前我實際上在考慮它,我得出結論,有不同的選擇,每個都有自己的權衡,即:

使用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 命令,而在 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
}

總結:我個人會選擇最后一個變體,因為盡管它最難實現,但它是最可靠的。

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

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

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

` QDir::home()返回用戶的主目錄。

您可以使用qEnvironmentVariable

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

您也可以像這樣使用QProcessEnvironment

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

有一種方法可以使用 Qt 獲取當前的 Windows 用戶名。 這里是

mainwindow.ui這是表單ui

主窗口.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;
}

輸出:代碼輸出

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM