web-dev-qa-db-fra.com

Obtenir le nom d'utilisateur du système en Qt

Existe-t-il un moyen multiplateforme d'obtenir le nom d'utilisateur actuel dans un programme Qt C++?

J'ai parcouru Internet et la documentation pour trouver une solution, mais je ne trouve que les appels système dépendants du système d'exploitation.

16
migas

J'y pensais il y a quelques jours et je suis arrivé à la conclusion qu'il y avait différentes alternatives, chacune avec son propre compromis, à savoir:

Variables d'environnement utilisant qgetenv .

L'avantage de cette solution serait qu'elle est vraiment facile à mettre en œuvre. L'inconvénient est que si la variable d'environnement est définie sur autre chose, cette solution n'est alors absolument pas fiable.

#include <QString>
#include <QDebug>

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

Lieu de résidence avec QStandardPaths

L’avantage est qu’elle est relativement facile à mettre en œuvre, mais qu’elle peut également ne pas être fiable car il est valide d’utiliser un nom d’utilisateur et une "entrée" différents dans l’emplacement de départ de l’utilisateur.

#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;
}

Exécuter des processus externes et utiliser des API spécifiques à la plate-forme

C’est probablement le plus difficile à mettre en œuvre, mais d’un autre côté, cela semble être le plus fiable, car il ne peut pas être modifié aussi facilement sous l’application, comme avec les astuces de variable d’environnement ou de localisation. Sous Linux, vous utiliseriez QProcess pour appeler l'habituel commande whoami }, et sous Windows, vous utiliseriez GetUserName WinAPI à cette fin.

#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
}

Résumé : Je choisirais personnellement la dernière variante car, même si c'est la plus difficile à mettre en œuvre, c'est la plus fiable.

36
lpapp

Il n'y a aucun moyen d'obtenir le nom d'utilisateur actuel avec Qt.

Cependant, vous pouvez lire ces liens:

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

Je pense que la meilleure méthode est:

#include <stdlib.h>

getenv("USER"); ///for MAc or Linux
getenv("USERNAME"); //for windows

EDIT: Vous pouvez utiliser qgetenv au lieu de getenv.

4
jd6

A partir de QT5, il est possible de faire ce qui suit:

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

` QDir :: home () retourne le répertoire personnel de l'utilisateur.

2
Flot2011

Il existe un moyen d'obtenir le nom d'utilisateur Windows actuel avec Qt. C'est ici

mainwindow.ui C'est la forme 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;
}

Sortie: Sortie du code

0
Starlyvil