c++ - 在 Qt 中获取系统用户名

标签 c++ qt qtcore

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

总结:我个人会选择最后一个变体,因为尽管它最难实现,但它是最可靠的。

关于c++ - 在 Qt 中获取系统用户名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26552517/

相关文章:

Qt:*.pro 与 *.pri

c++ - QFile 无法识别文件 :///url path format

c++ - 如果我只想专门化模板中的一种方法,我该怎么做?

c++ - CodeBlock 在执行程序时打开 2 个控制台窗口

qt - QT on Symbian 如何设置应用程序图标?

c++ - QTreeView 合并一些单元格

c++ - 如何以编程方式更改布局中小部件的顺序?

c++ - QObject : Missing vtable link error

c++ - 函数参数中的新运算符

c++ - C++ 临时对象的生命周期是在什么时候创建的? : expression extended by binding it to a local const reference?