📢 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> | ||