Ответ 1
Я думал об этом несколько дней назад, и я пришел к выводу, что у меня есть разные альтернативы, каждый из которых имеет свой собственный компромисс, а именно:
Переменные среды с помощью 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
}
Сводка: Я бы лично пошел на последний вариант, так как, хотя это наиболее сложно реализовать, это самый надежный.