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.
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:
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;
}
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;
}
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.
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
.
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.
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