「Qtの基礎 - シャットダウン」の版間の差分

ナビゲーションに移動 検索に移動
4行目: 4行目:


== シャットダウン ==
== シャットダウン ==
* shutdownコマンドを実行する場合
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
#include <QProcess>
#include <QInputDialog>
  void Converter::shutdown()
  void Converter::shutdown()
  {
  {
     bool shutdown_works = false;
     // GNOME Power Managementコマンドを試行
     bool gnome_power1 = false;
     if (QProcess::startDetached("gnome-power-cmd.sh shutdown") || QProcess::startDetached("gnome-power-cmd shutdown")) {
    bool gnome_power2 = false;
      qInfo() << "Shutdown initiated via GNOME Power Management command.";
    bool hal_works = false;
      return;
     QDBusMessage response;
     }
   
   
     // GNOME
     // sudo shutdownを試行
     QDBusInterface gnomeSessionManager("org.gnome.SessionManager", "/org/gnome/SessionManager", "org.gnome.SessionManager", QDBusConnection::sessionBus());
     qWarning() << "Attempting to shutdown using sudo. This requires root privileges.";
   
   
     response = gnomeSessionManager.call("RequestShutdown");
     // パスワード入力ダイアログを表示
    bool ok;
    QString password = QInputDialog::getText(this, "Sudo Password", "Enter your sudo password to proceed with shutdown:",
                                            QLineEdit::Password, QString(), &ok);
   
   
     if(response.type() == QDBusMessage::ErrorMessage)
     if (!ok || password.isEmpty()) {
    {
       qWarning() << "Shutdown cancelled: No password provided.";
       if(verbose)
       qCritical() << "All shutdown methods failed.";
          qWarning() << "W: " << response.errorName() << ":" << response.errorMessage();
       return;
       gnome_power1 = QProcess::startDetached("gnome-power-cmd.sh shutdown");
    }
       gnome_power2 = QProcess::startDetached("gnome-power-cmd shutdown");
   
   
      if(verbose && !gnome_power1 && !gnome_power2)
    // sudoコマンドを実行
          qWarning() << "W: gnome-power-cmd and gnome-power-cmd.sh didn't work";
    QProcess process;
    process.start("sudo", QStringList() << "-S" << "shutdown" << "-P" << "now");
    if (!process.waitForStarted()) {
      qCritical() << "Failed to start sudo process:" << process.errorString();
      qCritical() << "All shutdown methods failed.";
      return;
     }
     }
     else
     {
    // パスワードを入力
       shutdown_works = true;
    process.write(password.toUtf8() + "\n");
     // プロセスの終了を待つ
     if (!process.waitForFinished()) {
       qCritical() << "Shutdown process did not finish:" << process.errorString();
      qCritical() << "All shutdown methods failed.";
      return;
     }
     }
   
   
     // KDE
     // 終了コードを確認
     QDBusInterface kdeSessionManager("org.kde.ksmserver", "/KSMServer", "org.kde.KSMServerInterface", QDBusConnection::sessionBus());
     if (process.exitCode() != 0) {
      qCritical() << "Shutdown failed. Exit code:" << process.exitCode();
      qCritical() << "Error output:" << process.readAllStandardError();
      qCritical() << "All shutdown methods failed.";
      return;
    }
   
   
     response = kdeSessionManager.call("logout", 0, 2, 2);
     qInfo() << "Shutdown initiated via sudo command.";
}
</syntaxhighlight>
<br>
* D-Busを使用する場合
<syntaxhighlight lang="c++">
#include <QDBus>
#include <QDebug>
   
   
     if(response.type() == QDBusMessage::ErrorMessage)
void Converter::shutdown()
     {
{
       if(verbose)
    // GNOMEセッションマネージャを試行
       {
     QDBusInterface gnomeSessionManager("org.gnome.SessionManager",
           qWarning() << "W: " << response.errorName() << ":" << response.errorMessage();
                                      "/org/gnome/SessionManager",
                                      "org.gnome.SessionManager",
                                      QDBusConnection::sessionBus());
     if (gnomeSessionManager.isValid()) {
       QDBusReply<void> reply = gnomeSessionManager.call("RequestShutdown");
       if (reply.isValid()) {
           qInfo() << "Shutdown initiated via GNOME Session Manager.";
          return;
       }
       }
      qWarning() << "GNOME Session Manager shutdown failed:" << reply.error().message();
     }
     }
     else
     {
    // KDEセッションマネージャを試行
       shutdown_works = true;
     QDBusInterface kdeSessionManager("org.kde.ksmserver",
                                    "/KSMServer",
                                    "org.kde.KSMServerInterface",
                                    QDBusConnection::sessionBus());
     if (kdeSessionManager.isValid()) {
       QDBusReply<void> reply = kdeSessionManager.call("logout", 0, 2, 2);
      if (reply.isValid()) {
          qInfo() << "Shutdown initiated via KDE Session Manager.";
          return;
      }
      qWarning() << "KDE Session Manager shutdown failed:" << reply.error().message();
     }
     }
   
   
     if(!shutdown_works && !gnome_power1 && !gnome_power2)
     // HAL (Hardware Abstraction Layer) を試行
     {
     QDBusInterface halPower("org.freedesktop.Hal",
      QDBusInterface powermanagement("org.freedesktop.Hal", "/org/freedesktop/Hal/devices/computer",
                            "/org/freedesktop/Hal/devices/computer",
                                      "org.freedesktop.Hal.Device.SystemPowerManagement", QDBusConnection::systemBus());
                            "org.freedesktop.Hal.Device.SystemPowerManagement",
                            QDBusConnection::systemBus());
       response = powermanagement.call("Shutdown");
    if (halPower.isValid()) {
       if(response.type() == QDBusMessage::ErrorMessage)
       QDBusReply<void> reply = halPower.call("Shutdown");
      {
       if (reply.isValid()) {
           if(verbose)
           qInfo() << "Shutdown initiated via HAL.";
          {
           return;
            qWarning() << "W: " << response.errorName() << ":" << response.errorMessage();
           }
      }
      else
      {
          hal_works = true;
       }
       }
      qWarning() << "HAL shutdown failed:" << reply.error().message();
     }
     }
   
   
     if(!hal_works && !shutdown_works && !gnome_power1 && !gnome_power2)
     // ConsoleKitを試行
     {
     QDBusInterface consoleKit("org.freedesktop.ConsoleKit",
      QDBusInterface powermanagement("org.freedesktop.ConsoleKit", "/org/freedesktop/ConsoleKit/Manager",
                              "/org/freedesktop/ConsoleKit/Manager",
                                      "org.freedesktop.ConsoleKit.Manager", QDBusConnection::systemBus());
                              "org.freedesktop.ConsoleKit.Manager",
                              QDBusConnection::systemBus());
       response = powermanagement.call("Stop");
    if (consoleKit.isValid()) {
       QDBusReply<void> reply = consoleKit.call("Stop");
       if(response.type() == QDBusMessage::ErrorMessage)
       if (reply.isValid()) {
      {
           qInfo() << "Shutdown initiated via ConsoleKit.";
           if(verbose)
           return;
          {
            qWarning() << "W: " << response.errorName() << ":" << response.errorMessage();
           }
          QProcess::startDetached("sudo shutdown -P now");
       }
       }
      qWarning() << "ConsoleKit shutdown failed:" << reply.error().message();
     }
     }
    qCritical() << "All shutdown methods failed.";
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>

案内メニュー