web-dev-qa-db-ja.com

Qtでシステムユーザー名を取得する

Qt C++プログラムで現在のユーザー名を取得するクロスプラットフォームの方法はありますか?

私はインターネットとソリューションのドキュメントをクロールしましたが、OSに依存するシステムコールのみが見つかりました。

18
migas

私は実際に数日前にそれについて考えていました、そして私はそれぞれ独自のトレードオフを備えた異なる選択肢を持つという結論に達しました、すなわち:

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
}

要約:実装するのは最も難しいですが、最も信頼できるので、個人的に最後のバリアントを使用します。

40
lpapp

Qtで現在のユーザー名を取得する方法はありません。

ただし、このリンクを読むことができます。

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

私は最善の方法だと思います:

#include <stdlib.h>

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

編集:qgetenvの代わりにgetenvを使用できます。

5
jd6

QT5以降では、次のことが可能です。

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

` QDir :: home() はユーザーのホームディレクトリを返します。

2
Flot2011

qEnvironmentVariable を使用できます

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

Qtで現在のWindowsユーザー名を取得する方法があります。ここにあります

mainwindow.uiこれは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;
}

出力:コード出力

0
Starlyvil