Wenn Ihr System haben systemd, dann können Sie logind Funktionalität über D-Bus verwenden. Qt Lösung ist die folgende (nur getestet):
QDBusInterface logind{"org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", QDBusConnection::systemBus()};
const auto message = logind.callWithArgumentList(QDBus::Block, "CanPowerOff", {});
QDBusPendingReply<QString> canPowerOff = message;
Q_ASSERT(canPowerOff.isFinished());
if (canPowerOff.isError()) {
const auto error = canPowerOff.error();
qWarning().noquote()
<< QDBusInterface::tr("Asynchronous call finished with error: %1 (%2)")
.arg(error.name(), error.message());
return EXIT_FAILURE;
}
if (canPowerOff.value() == "yes") {
QDBusPendingReply<> powerOff = logind.callWithArgumentList(QDBus::Block, "PowerOff", {true, });
Q_ASSERT(powerOff.isFinished());
if (powerOff.isError()) {
const auto error = powerOff.error();
qWarning().noquote()
<< QDBusInterface::tr("Asynchronous call finished with error: %1 (%2)")
.arg(error.name(), error.message());
return EXIT_FAILURE;
}
} else {
qCritical().noquote()
<< QCoreApplication::translate("poweroff", "Can't power off: CanPowerOff() result is %1")
.arg(canPowerOff.value());
return EXIT_FAILURE;
}
auch möglich, dass es notwendig ist, eine Datei /etc/polkit-1/localauthority/50-local.d/10-enable-shutdown.pkla
zu unterdrücken interaktive Authentifizierung Anforderung hinzuzufügen:
[Enable shoutdown for users]
Identity=unix-group:users
Action=org.freedesktop.login1;org.freedesktop.login1.power-off;org.freedesktop.login1.power-off-ignore-inhibit;org.freedesktop.login1.power-off-multiple-sessions
ResultAny=yes
ResultInactive=yes
ResultActive=yes
Warum ist 'System()' nicht beraten? – cmannett85
Lesen Sie über [** DBus **] (http://dbus.freedesktop.org/doc/dbus-tutorial.html). BTW, da ist eine 'QDBus'-API, denke ich. –
@ cmannett85 aus einem sehr einfachen Grund, wenn das OP Qt verwendet bedeutet es, dass Root-Berechtigungen innerhalb einer GUI-Anwendung erfordern würde, wirklich schlechte Idee. Das Aufrufen von Programmen mit 'system()' stellt fast immer ein Sicherheitsproblem dar. –