📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

283行目: 283行目:
<code>qdbusviewer</code>は、Qtで作成されたGUIソフトウェアであり、<code>qdbus</code>コマンドがCUIから提供する機能と基本的に同一のものをGUIとして提供している。<br>
<code>qdbusviewer</code>は、Qtで作成されたGUIソフトウェアであり、<code>qdbus</code>コマンドがCUIから提供する機能と基本的に同一のものをGUIとして提供している。<br>
<code>qdbusviewer</code>は、Qt本体と同梱されており、オブジェクトアドレス等のD-Busの基本概念に慣れていれば、誰でも簡単に使用できる。<br>
<code>qdbusviewer</code>は、Qt本体と同梱されており、オブジェクトアドレス等のD-Busの基本概念に慣れていれば、誰でも簡単に使用できる。<br>
<br><br>
== QtとD-Bus ==
以下の例では、Qtにおいて、D-Busを使用したメッセージの送受信を行っている。<br>
# セッションバスへの接続を取得する。
# セッションバスへのD-Busインターフェースを作成する。
# D-Busインターフェイス名でのサービス登録する。
# バス上に誰が存在しているかを確認する。
# pingリクエストを受信するために登録する。
# Pingメッセージの送信する。
# 受信したPingメッセージの表示する。
<br>
受信したPingメッセージの表示以外は、doItメソッドで行う。<br>
Pingメッセージは、pingReceivedメソッドで処理される。<br>
<br>
プログラムを実行すると、セッションバス上に既に多くのサービスが表示されるが、"-- end --"の付近にPingリクエストに応答していることがわかる。<br>
<br>
<syntaxhighlight lang="c++">
#include <QDBusConnection>
#include <QDBusConnectionInterface>
#include <QTimer>
#include "MyObject.h"
MyObject::MyObject(QObject *parent) : QObject(parent)
{
    QTimer::singleShot(10, this, &MyObject::doIt);
}
void MyObject::doIt()
{
    /// [1] セッションバスへの接続を取得
    QDBusConnection bus = QDBusConnection::sessionBus();
    /// [2] セッションバスへD-Busインターフェースを作成
    QDBusConnectionInterface *busIF = bus.interface();
    /// [3] D-Busインターフェイス名でのサービス登録
    QString ifName = "com.packt.bigproject";
    busIF->registerService(ifName,
                          QDBusConnectionInterface::ReplaceExistingService,
                          QDBusConnectionInterface::AllowReplacement);
    /// [4] バス上に誰が存在しているかを確認
    QDBusReply<QStringList> serviceNames = busIF->registeredServiceNames();
    qDebug() << bus.name() << "knows the following Services:" << serviceNames.value();
    /// [5] pingリクエストを受信するために登録 (QObject::connectメソッドと似ている)
    QString service = "";
    QString path = "";
    QString name = "ping";
    bus.connect(service, path, ifName, name, this, SLOT(pingReceived(QString)));
    /// [6] Pingメッセージを送信
    QDBusMessage msg = QDBusMessage::createSignal("/", ifName, name);
    msg << "Hello World!";
    bus.send(msg);
    /// 5秒以内にもう1度行う
    QTimer::singleShot(5000, this, &MyObject::doIt);
}
void MyObject::pingReceived(QString msg)
{
    /// [8] 受信したPingメッセージの表示
    qDebug() << __FUNCTION__ << "Ping:" << msg;
}
</syntaxhighlight>
<br>
サンプルコードの詳細を知りたい場合は、以下に示すGithubを参照すること。<br>
https://github.com/PacktPublishing/Hands-On-Embedded-Programming- with-Qt/blob/master/Chapter10/DBusBruteForce/MyObject.cpp<br>
<br><br>
<br><br>