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

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
編集の要約なし
(文字列「__FORCETOC__」を「{{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This pag…)
 
(同じ利用者による、間の5版が非表示)
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;
     }
     // sudo shutdownを試行
     qWarning() << "Attempting to shutdown using sudo. This requires root privileges.";
   
   
     // GNOME
     // パスワード入力ダイアログを表示
     QDBusInterface gnomeSessionManager("org.gnome.SessionManager", "/org/gnome/SessionManager", "org.gnome.SessionManager", QDBusConnection::sessionBus());
     bool ok;
    QString password = QInputDialog::getText(this, "Sudo Password", "Enter your sudo password to proceed with shutdown:",
                                            QLineEdit::Password, QString(), &ok);
   
   
     response = gnomeSessionManager.call("RequestShutdown");
     if (!ok || password.isEmpty()) {
      qWarning() << "Shutdown cancelled: No password provided.";
      qCritical() << "All shutdown methods failed.";
      return;
    }
   
   
     if(response.type() == QDBusMessage::ErrorMessage)
     // sudoコマンドを実行
     {
     QProcess process;
      if(verbose)
    process.start("sudo", QStringList() << "-S" << "shutdown" << "-P" << "now");
          qWarning() << "W: " << response.errorName() << ":" << response.errorMessage();
      gnome_power1 = QProcess::startDetached("gnome-power-cmd.sh shutdown");
      gnome_power2 = QProcess::startDetached("gnome-power-cmd shutdown");
   
   
      if(verbose && !gnome_power1 && !gnome_power2)
    if (!process.waitForStarted()) {
          qWarning() << "W: gnome-power-cmd and gnome-power-cmd.sh didn't work";
      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>
173行目: 215行目:
<br><br>
<br><br>


== サスペンド(スリープ) ==
== スリープ ==
* プロセスを直接起動する場合
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
#include <QProcess>
#include <QDebug>
  void Converter::suspend()
  void Converter::suspend()
  {
  {
     bool gnome_power1 = false;
     auto trySuspendCommand = [this](const QString &command, const QStringList &arguments, bool useAuth = false) {
    bool gnome_power2 = false;
      QProcess process;
    bool hal_works = false;
      if (useAuth) {
    QDBusMessage response;
          bool ok;
          QString password = QInputDialog::getText(this, "rootパスワード",
                                                  "サスペンドを実行するためのsudoパスワードを入力:",
                                                  QLineEdit::Password, QString(), &ok);
          if (!ok || password.isEmpty()) {
            qWarning() << "サスペンドがキャンセルされました: パスワードが提供されていません";
            return false;
          }
   
   
    gnome_power1 = QProcess::startDetached("gnome-power-cmd.sh suspend");
          process.start("sudo", QStringList() << "-S" << command << arguments);
    gnome_power2 = QProcess::startDetached("gnome-power-cmd suspend");
   
   
    if(!gnome_power1 && !gnome_power2 && verbose)
          if (!process.waitForStarted()) {
    {
            qCritical() << "sudoプロセスの開始に失敗: " << process.errorString();
      qWarning() << "W: gnome-power-cmd and gnome-power-cmd.sh didn't work";
            return false;
    }
          }
   
   
    if(!gnome_power1 && !gnome_power2)
          process.write(password.toUtf8() + "\n");
    {
       }
      QDBusInterface powermanagement("org.freedesktop.Hal", "/org/freedesktop/Hal/devices/computer",
      else {
                                      "org.freedesktop.Hal.Device.SystemPowerManagement", QDBusConnection::systemBus());
          process.start(command, arguments);
       response = powermanagement.call("Suspend", 0);
      }
   
   
       if(response.type() == QDBusMessage::ErrorMessage)
      // 5秒待機
      {
       if (!process.waitForFinished(5000)) {
           if(verbose)
           qWarning() << "サスペンドプロセスが完了しませんでした: " << process.errorString();
          {
           return false;
            qWarning() << "W: " << response.errorName() << ":" << response.errorMessage();
           }
       }
       }
      else
       {
       if (process.exitCode() != 0) {
           hal_works = true;
           qWarning() << "サスペンドに失敗しました。終了コード: " << process.exitCode();
          qWarning() << "エラー出力: " << process.readAllStandardError();
          return false;
       }
       }
      return true;
    };
    // Systemctlを使用してサスペンドを試行
    if (trySuspendCommand("systemctl", QStringList() << "suspend")) {
        qInfo() << "Systemctl経由でサスペンド";
        return;
     }
     }
    qWarning() << "Systemctl経由でのサスペンドに失敗";
   
   
     if(!hal_works && !gnome_power1 && !gnome_power2)
    // pm-suspendを使用してサスペンドを試行 (古いLinuxシステム向け)
     {
     if (trySuspendCommand("pm-suspend", QStringList())) {
      QDBusInterface powermanagement("org.freedesktop.DeviceKit.Power", "/org/freedesktop/DeviceKit/Power",
      qInfo() << "pm-suspend経由でサスペンド";
                                      "org.freedesktop.DeviceKit.Power", QDBusConnection::systemBus());
      return;
       response = powermanagement.call("Suspend");
    }
    qWarning() << "pm-suspend経由でのサスペンドに失敗";
}
</syntaxhighlight>
<br>
* D-Busを使用する場合
<syntaxhighlight lang="c++">
#include <QDBus>
#include <QDebug>
void Converter::suspend()
{
    auto tryDBusCall = [](const QString &service, const QString &path, const QString &interface, const QString &method) {
        QDBusInterface dbusInterface(service, path, interface, QDBusConnection::systemBus());
        QDBusReply<void> reply = dbusInterface.call(method);
        return reply.isValid();
     };
    // Systemdを試行
    if (tryDBusCall("org.freedesktop.login1",  
                    "/org/freedesktop/login1",  
                    "org.freedesktop.login1.Manager",  
                    "Suspend")) {
      qInfo() << "システムはsystemd経由でサスペンドされました";
      return;
    }
    qWarning() << "Systemd経由でのサスペンドに失敗";
    // Systemdが失敗した場合、GNOMEのセッションマネージャを試行
    if (tryDBusCall("org.gnome.SessionManager",
                    "/org/gnome/SessionManager",
                    "org.gnome.SessionManager",
                    "Suspend")) {
       qInfo() << "GNOMEセッションマネージャ経由でサスペンド";
      return;
    }
    qWarning() << "GNOMEセッションマネージャ経由でのサスペンドに失敗";
   
   
      if(response.type() == QDBusMessage::ErrorMessage)
    // UPowerインターフェースを試行
      {
    if (tryDBusCall("org.freedesktop.UPower",
          if(verbose)
                    "/org/freedesktop/UPower",
          {
                    "org.freedesktop.UPower",
            qWarning() << "W: " << response.errorName() << ":" << response.errorMessage();
                    "Suspend")) {
          }
      qInfo() << "UPower経由でサスペンド";
       }
       return;
     }
     }
    qWarning() << "UPower経由でのサスペンドに失敗";
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>
228行目: 328行目:


== ハイバネート ==
== ハイバネート ==
* GNOME Power Managementコマンドを実行する場合
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
#include <QProcess>
  void Converter::hibernate()
  void Converter::hibernate()
  {
  {
     bool gnome_power1 = false;
     // GNOME Power Management コマンドを試行
     bool gnome_power2 = false;
     if (QProcess::startDetached("gnome-power-cmd.sh hibernate") ||
    bool hal_works = false;
      QProcess::startDetached("gnome-power-cmd hibernate")) {
     QDBusMessage response;
      qInfo() << "Hibernation initiated via GNOME Power Management.";
      return;
     }
   
   
     gnome_power1 = QProcess::startDetached("gnome-power-cmd.sh hibernate");
     qWarning() << "GNOME Power Management commands failed. Trying DBus methods.";
    gnome_power2 = QProcess::startDetached("gnome-power-cmd hibernate");
}
    if(!gnome_power1 && !gnome_power2 && verbose)
</syntaxhighlight>
    {
<br>
      qWarning() << "W: gnome-power-cmd and gnome-power-cmd.sh didn't work";
* D-Busを使用する場合
    }
<syntaxhighlight lang="c++">
#include <QDBusInterface>
#include <QDBusReply>
#include <QDebug>
   
   
     if(!gnome_power1 && !gnome_power2)
void Converter::hibernate()
     {
{
      QDBusInterface powermanagement("org.freedesktop.Hal", "/org/freedesktop/Hal/devices/computer",
     // HAL (Hardware Abstraction Layer) を試行
                                      "org.freedesktop.Hal.Device.SystemPowerManagement", QDBusConnection::systemBus());
     QDBusInterface halPower("org.freedesktop.Hal",  
      response = powermanagement.call("Hibernate");
                            "/org/freedesktop/Hal/devices/computer",
                            "org.freedesktop.Hal.Device.SystemPowerManagement",  
                            QDBusConnection::systemBus());
   
   
      if(response.type() == QDBusMessage::ErrorMessage)
    if (halPower.isValid()) {
       {
      QDBusReply<void> reply = halPower.call("Hibernate");
          if(verbose)
       if (reply.isValid()) {
           {
           qInfo() << "Hibernation initiated via HAL.";
            qWarning() << "W: " << response.errorName() << ":" << response.errorMessage();
           return;
           }
      }
      else
      {
          hal_works = true;
       }
       }
      qWarning() << "HAL hibernation failed:" << reply.error().message();
    }
    else {
      qWarning() << "Failed to connect to HAL power management.";
     }
     }
   
   
     if(!hal_works && !gnome_power1 && !gnome_power2)
     // DeviceKit Powerを試行
     {
     QDBusInterface dkPower("org.freedesktop.DeviceKit.Power",  
      QDBusInterface powermanagement("org.freedesktop.DeviceKit.Power", "/org/freedesktop/DeviceKit/Power",
                          "/org/freedesktop/DeviceKit/Power",
                                      "org.freedesktop.DeviceKit.Power", QDBusConnection::systemBus());
                          "org.freedesktop.DeviceKit.Power",  
                          QDBusConnection::systemBus());
      if(response.type() == QDBusMessage::ErrorMessage)
   
      {
    if (dkPower.isValid()) {
          if(verbose)
        QDBusReply<void> reply = dkPower.call("Hibernate");
          {
        if (reply.isValid()) {
            qWarning() << "W: " << response.errorName() << ":" << response.errorMessage();
            qInfo() << "Hibernation initiated via DeviceKit Power.";
          }
            return;
       }
       }
      qWarning() << "DeviceKit Power hibernation failed:" << reply.error().message();
    }
    else {
      qWarning() << "Failed to connect to DeviceKit Power.";
     }
     }
    qCritical() << "All hibernation methods failed.";
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>
280行目: 395行目:


== 画面のロック ==
== 画面のロック ==
QDBusモジュールを使用して、GNOMEスクリーンセーバーのD-Busインターフェースに接続して、Lockメソッドを呼び出してスクリーンをロックしている。<br>
<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
#include <QDBus>
#include <QMessageBox>
  void Converter::lock()
  void Converter::lock()
  {
  {
     if(system("gnome-screensaver-command -l") && system("dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock"))
     QDBusInterface screensaver("org.gnome.ScreenSaver", "/org/gnome/ScreenSaver", "org.gnome.ScreenSaver");
     {
      QMessageBox::warning(this, "Error", "Unable to lock computer.", QMessageBox::Ok, NULL);
    if (!screensaver.isValid()) {
        QMessageBox::warning(this, "Error", "Unable to connect to GNOME ScreenSaver.", QMessageBox::Ok);
        return;
    }
    QDBusReply<void> reply = screensaver.call("Lock");
     if (!reply.isValid()) {
        QMessageBox::warning(this, "Error", "Unable to lock computer: " + reply.error().message(), QMessageBox::Ok);
     }
     }
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>
{{#seo:
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux
|image=/resources/assets/MochiuLogo_Single_Blue.png
}}


__FORCETOC__
__FORCETOC__
[[カテゴリ:Qt]]
[[カテゴリ:Qt]]

2024年10月14日 (月) 10:58時点における最新版

概要

Qtライブラリを使用して、ソフトウェアからOSのシャットダウンや再起動等を行う方法を記載する。


シャットダウン

  • shutdownコマンドを実行する場合
 #include <QProcess>
 #include <QInputDialog>
 
 void Converter::shutdown()
 {
    // GNOME Power Managementコマンドを試行
    if (QProcess::startDetached("gnome-power-cmd.sh shutdown") || QProcess::startDetached("gnome-power-cmd shutdown")) {
       qInfo() << "Shutdown initiated via GNOME Power Management command.";
       return;
    }
 
    // sudo shutdownを試行
    qWarning() << "Attempting to shutdown using sudo. This requires root privileges.";
 
    // パスワード入力ダイアログを表示
    bool ok;
    QString password = QInputDialog::getText(this, "Sudo Password", "Enter your sudo password to proceed with shutdown:",
                                             QLineEdit::Password, QString(), &ok);
 
    if (!ok || password.isEmpty()) {
       qWarning() << "Shutdown cancelled: No password provided.";
       qCritical() << "All shutdown methods failed.";
       return;
    }
 
    // sudoコマンドを実行
    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;
    }
 
    // パスワードを入力
    process.write(password.toUtf8() + "\n");
 
    // プロセスの終了を待つ
    if (!process.waitForFinished()) {
       qCritical() << "Shutdown process did not finish:" << process.errorString();
       qCritical() << "All shutdown methods failed.";
       return;
    }
 
    // 終了コードを確認
    if (process.exitCode() != 0) {
       qCritical() << "Shutdown failed. Exit code:" << process.exitCode();
       qCritical() << "Error output:" << process.readAllStandardError();
       qCritical() << "All shutdown methods failed.";
       return;
    }
 
    qInfo() << "Shutdown initiated via sudo command.";
 }


  • D-Busを使用する場合
 #include <QDBus>
 #include <QDebug>
 
 void Converter::shutdown()
 {
    // GNOMEセッションマネージャを試行
    QDBusInterface gnomeSessionManager("org.gnome.SessionManager",
                                       "/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();
    }
 
    // KDEセッションマネージャを試行
    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();
    }
 
    // HAL (Hardware Abstraction Layer) を試行
    QDBusInterface halPower("org.freedesktop.Hal",
                            "/org/freedesktop/Hal/devices/computer",
                            "org.freedesktop.Hal.Device.SystemPowerManagement",
                            QDBusConnection::systemBus());
    if (halPower.isValid()) {
       QDBusReply<void> reply = halPower.call("Shutdown");
       if (reply.isValid()) {
          qInfo() << "Shutdown initiated via HAL.";
          return;
       }
       qWarning() << "HAL shutdown failed:" << reply.error().message();
    }
 
    // ConsoleKitを試行
    QDBusInterface consoleKit("org.freedesktop.ConsoleKit",
                              "/org/freedesktop/ConsoleKit/Manager",
                              "org.freedesktop.ConsoleKit.Manager",
                              QDBusConnection::systemBus());
    if (consoleKit.isValid()) {
       QDBusReply<void> reply = consoleKit.call("Stop");
       if (reply.isValid()) {
          qInfo() << "Shutdown initiated via ConsoleKit.";
          return;
       }
       qWarning() << "ConsoleKit shutdown failed:" << reply.error().message();
    }
 
    qCritical() << "All shutdown methods failed.";
 }



再起動

 void Converter::reboot()
 {
    bool reboot_works = false;
    bool gnome_power1 = false;
    bool gnome_power2 = false;
    bool hal_works = false;
    QDBusMessage response;
 
    // GNOME
    QDBusInterface gnomeSessionManager("org.gnome.SessionManager", "/org/gnome/SessionManager", "org.gnome.SessionManager", QDBusConnection::sessionBus());
    response = gnomeSessionManager.call("RequestReboot");
    if(response.type() == QDBusMessage::ErrorMessage)
    {
       if(verbose)
       {
          qWarning() << "W: " << response.errorName() << ":" << response.errorMessage();
       }
       gnome_power1 = QProcess::startDetached("gnome-power-cmd.sh reboot");
       gnome_power2 = QProcess::startDetached("gnome-power-cmd reboot");
       if(verbose && !gnome_power1 && !gnome_power2)
       {
          qWarning() << "W: gnome-power-cmd and gnome-power-cmd.sh didn't work";
       }
    }
    else
    {
       reboot_works = true;
    }
 
    // KDE
    QDBusInterface kdeSessionManager("org.kde.ksmserver", "/KSMServer", "org.kde.KSMServerInterface", QDBusConnection::sessionBus());
    response = kdeSessionManager.call("logout", 0, 2, 1);
 
    if(response.type() == QDBusMessage::ErrorMessage)
    {
       if(verbose)
       {
          qWarning() << "W: " << response.errorName() << ":" << response.errorMessage();
       }
    }
    else
    {
       reboot_works = true;
    }
 
    if(!reboot_works && !gnome_power1 && !gnome_power2)
    {
       QDBusInterface powermanagement("org.freedesktop.Hal", "/org/freedesktop/Hal/devices/computer", "org.freedesktop.Hal.Device.SystemPowerManagement",
                                      QDBusConnection::systemBus());
       response = powermanagement.call("Reboot");
       if(response.type() == QDBusMessage::ErrorMessage)
       {
          if(verbose)
          {
             qWarning() << "W: " << response.errorName() << ":" << response.errorMessage();
          }
       }
       else
       {
          hal_works = true;
       }
    }
 
    if(!hal_works && !reboot_works && !gnome_power1 && !gnome_power2)
    {
       QDBusInterface powermanagement("org.freedesktop.ConsoleKit", "/org/freedesktop/ConsoleKit/Manager", "org.freedesktop.ConsoleKit.Manager",
                                      QDBusConnection::systemBus());
       response = powermanagement.call("Restart");
 
       if(response.type() == QDBusMessage::ErrorMessage)
       {
          if(verbose)
          {
             qWarning() << "W: " << response.errorName() << ":" << response.errorMessage();
          }
          QProcess::startDetached("sudo shutdown -r now");
       }
    }
 }



スリープ

  • プロセスを直接起動する場合
 #include <QProcess>
 #include <QDebug>
 
 void Converter::suspend()
 {
    auto trySuspendCommand = [this](const QString &command, const QStringList &arguments, bool useAuth = false) {
       QProcess process;
       if (useAuth) {
          bool ok;
          QString password = QInputDialog::getText(this, "rootパスワード", 
                                                   "サスペンドを実行するためのsudoパスワードを入力:",
                                                   QLineEdit::Password, QString(), &ok);
 
          if (!ok || password.isEmpty()) {
             qWarning() << "サスペンドがキャンセルされました: パスワードが提供されていません";
             return false;
          }
 
          process.start("sudo", QStringList() << "-S" << command << arguments);
 
          if (!process.waitForStarted()) {
             qCritical() << "sudoプロセスの開始に失敗: " << process.errorString();
             return false;
          }
 
          process.write(password.toUtf8() + "\n");
       }
       else {
          process.start(command, arguments);
       }
 
       // 5秒待機
       if (!process.waitForFinished(5000)) {
          qWarning() << "サスペンドプロセスが完了しませんでした: " << process.errorString();
          return false;
       }
 
       if (process.exitCode() != 0) {
          qWarning() << "サスペンドに失敗しました。終了コード: " << process.exitCode();
          qWarning() << "エラー出力: " << process.readAllStandardError();
          return false;
       }
 
       return true;
    };
 
    // Systemctlを使用してサスペンドを試行
    if (trySuspendCommand("systemctl", QStringList() << "suspend")) {
        qInfo() << "Systemctl経由でサスペンド";
        return;
    }
    qWarning() << "Systemctl経由でのサスペンドに失敗";
 
    // pm-suspendを使用してサスペンドを試行 (古いLinuxシステム向け)
    if (trySuspendCommand("pm-suspend", QStringList())) {
       qInfo() << "pm-suspend経由でサスペンド";
       return;
    }
    qWarning() << "pm-suspend経由でのサスペンドに失敗";
 }


  • D-Busを使用する場合
 #include <QDBus>
 #include <QDebug>
 
 void Converter::suspend()
 {
    auto tryDBusCall = [](const QString &service, const QString &path, const QString &interface, const QString &method) {
        QDBusInterface dbusInterface(service, path, interface, QDBusConnection::systemBus());
        QDBusReply<void> reply = dbusInterface.call(method);
 
        return reply.isValid();
    };
 
    // Systemdを試行
    if (tryDBusCall("org.freedesktop.login1", 
                    "/org/freedesktop/login1", 
                    "org.freedesktop.login1.Manager", 
                    "Suspend")) {
       qInfo() << "システムはsystemd経由でサスペンドされました";
       return;
    }
    qWarning() << "Systemd経由でのサスペンドに失敗";
 
    // Systemdが失敗した場合、GNOMEのセッションマネージャを試行
    if (tryDBusCall("org.gnome.SessionManager", 
                    "/org/gnome/SessionManager", 
                    "org.gnome.SessionManager", 
                    "Suspend")) {
       qInfo() << "GNOMEセッションマネージャ経由でサスペンド";
       return;
    }
    qWarning() << "GNOMEセッションマネージャ経由でのサスペンドに失敗";
 
    // UPowerインターフェースを試行
    if (tryDBusCall("org.freedesktop.UPower", 
                    "/org/freedesktop/UPower", 
                    "org.freedesktop.UPower", 
                    "Suspend")) {
       qInfo() << "UPower経由でサスペンド";
       return;
    }
    qWarning() << "UPower経由でのサスペンドに失敗";
 }



ハイバネート

  • GNOME Power Managementコマンドを実行する場合
 #include <QProcess>
 
 void Converter::hibernate()
 {
    // GNOME Power Management コマンドを試行
    if (QProcess::startDetached("gnome-power-cmd.sh hibernate") ||
       QProcess::startDetached("gnome-power-cmd hibernate")) {
       qInfo() << "Hibernation initiated via GNOME Power Management.";
       return;
    }
 
    qWarning() << "GNOME Power Management commands failed. Trying DBus methods.";
 }


  • D-Busを使用する場合
 #include <QDBusInterface>
 #include <QDBusReply>
 #include <QDebug>
 
 void Converter::hibernate()
 {
    // HAL (Hardware Abstraction Layer) を試行
    QDBusInterface halPower("org.freedesktop.Hal", 
                            "/org/freedesktop/Hal/devices/computer",
                            "org.freedesktop.Hal.Device.SystemPowerManagement", 
                            QDBusConnection::systemBus());
 
    if (halPower.isValid()) {
       QDBusReply<void> reply = halPower.call("Hibernate");
       if (reply.isValid()) {
          qInfo() << "Hibernation initiated via HAL.";
          return;
       }
       qWarning() << "HAL hibernation failed:" << reply.error().message();
    }
    else {
       qWarning() << "Failed to connect to HAL power management.";
    }
 
    // DeviceKit Powerを試行
    QDBusInterface dkPower("org.freedesktop.DeviceKit.Power", 
                           "/org/freedesktop/DeviceKit/Power",
                           "org.freedesktop.DeviceKit.Power", 
                           QDBusConnection::systemBus());
    
    if (dkPower.isValid()) {
        QDBusReply<void> reply = dkPower.call("Hibernate");
        if (reply.isValid()) {
            qInfo() << "Hibernation initiated via DeviceKit Power.";
            return;
       }
       qWarning() << "DeviceKit Power hibernation failed:" << reply.error().message();
    }
    else {
       qWarning() << "Failed to connect to DeviceKit Power.";
    }
 
    qCritical() << "All hibernation methods failed.";
 }



画面のロック

QDBusモジュールを使用して、GNOMEスクリーンセーバーのD-Busインターフェースに接続して、Lockメソッドを呼び出してスクリーンをロックしている。

 #include <QDBus>
 #include <QMessageBox>
 
 void Converter::lock()
 {
    QDBusInterface screensaver("org.gnome.ScreenSaver", "/org/gnome/ScreenSaver", "org.gnome.ScreenSaver");
 
    if (!screensaver.isValid()) {
        QMessageBox::warning(this, "Error", "Unable to connect to GNOME ScreenSaver.", QMessageBox::Ok);
        return;
    }
 
    QDBusReply<void> reply = screensaver.call("Lock");
 
    if (!reply.isValid()) {
        QMessageBox::warning(this, "Error", "Unable to lock computer: " + reply.error().message(), QMessageBox::Ok);
    }
 }