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

 
(同じ利用者による、間の4版が非表示)
147行目: 147行目:
<br>
<br>
* QByteArray localMachineId()
* QByteArray localMachineId()
*: D-Busシステムが知っているローカルIDを返します。
*: D-Busシステムが知っているローカルIDを返す。
<br>
<br>
* QDBusConnection sender()
* QDBusConnection sender()
264行目: 264行目:
* <code>-p <アダプターソースコードのファイル名></code> または <code>-P <アダプターソースコードのファイル名></code>
* <code>-p <アダプターソースコードのファイル名></code> または <code>-P <アダプターソースコードのファイル名></code>
*: アダプターソースコードのファイルへのプロキシコードを生成する。
*: アダプターソースコードのファイルへのプロキシコードを生成する。
<br><br>
== Qtプロジェクト (.pro) / CMakeLists.txt ==
* Qtプロジェクト (.pro) を使用する場合
<syntaxhighlight lang="make">
QT += dbus
</syntaxhighlight>
<br>
* CMakeLists.txtを使用する場合
<syntaxhighlight lang="cmake">
# QtDBusライブラリの検索 (Qt6を検索して、無ければQt5を使用)
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS DBus)
# QtDBusライブラリを検索
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS DBus)
# QtDBusライブラリとのリンク
target_link_libraries(<ターゲット名> PRIVATE
    Qt${QT_VERSION_MAJOR}::DBus
)
</syntaxhighlight>
<br><br>
<br><br>


527行目: 548行目:
*: この登録により、D-Busシステムは実行時にカスタム型の情報を持つことができ、適切なデータ変換を行うことができる。
*: この登録により、D-Busシステムは実行時にカスタム型の情報を持つことができ、適切なデータ変換を行うことができる。
<br>
<br>
したがって、qDBusRegisterMetaType<カスタム型>()を呼び出すことにより、カスタム型をD-Busシステムで使用可能にして、データを送受信できるようにしている。
したがって、<code>qDBusRegisterMetaType<カスタム型></code>関数を呼び出すことにより、カスタム型をD-Busシステムで使用可能にして、データを送受信できるようにしている。<br>
<br>
 
==== 構造体の受信 ====
<syntaxhighlight lang="c++">
// DBusReceiver.hファイル
#include <QCoreApplication>
#include <QDBusConnection>
#include <QDBusMessage>
#include <QDBusError>
#include <QDebug>
struct Hoge {
    QString str;
    QStringList list;
    int integer;
    double fpoint;
};
Q_DECLARE_METATYPE(Hoge)
// D-Bus向けマーシャリング関数
QDBusArgument &operator<<(QDBusArgument &argument, const Hoge &hoge) {
    argument.beginStructure();
    argument << hoge.str << hoge.list << hoge.integer << hoge.fpoint;
    argument.endStructure();
    return argument;
}
// D-Bus向けマーシャリング関数
const QDBusArgument &operator>>(const QDBusArgument &argument, Hoge &hoge) {
    argument.beginStructure();
    argument >> hoge.str >> hoge.list >> hoge.integer >> hoge.fpoint;
    argument.endStructure();
    return argument;
}
class DBusReceiver : public QObject {
    Q_OBJECT
    // Q_CLASSINFOマクロを使用して、D-Busインターフェース名を指定
    Q_CLASSINFO("D-Bus Interface", "org.example.hoge")
public:
    DBusReceiver(QObject *parent = nullptr) : QObject(parent) {}
public slots:
    bool sendstructure(const Hoge &hoge)
    {
      try {
          qDebug() << "受信した構造体:";
          qDebug() << "str: " << hoge.str;
          qDebug() << "list: " << hoge.list;
          qDebug() << "integer: " << hoge.integer;
          qDebug() << "fpoint: " << hoge.fpoint;
          return true;
      }
      catch (const std::exception &e) {
          qCritical() << "Error processing received structure: " << e.what();
          return false;
      }
    }
};
</syntaxhighlight>
<br>
<syntaxhighlight lang="c++">
// main.cppファイル
#include "DBusReceiver.h"
bool setupDBusConnection(DBusReceiver &receiver)
{
    QDBusConnection connection = QDBusConnection::sessionBus();
    if (!connection.isConnected()) {
        qCritical() << "Cannot connect to the D-Bus session bus:" << connection.lastError().message();
        return false;
    }
    if (!connection.registerService("org.example.hoge")) {
        qCritical() << "Failed to register service:" << connection.lastError().message();
        return false;
    }
    if (!connection.registerObject("/org/example/hoge", &receiver, QDBusConnection::ExportAllSlots)) {
        qCritical() << "Failed to register object:" << connection.lastError().message();
        return false;
    }
    return true;
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    // カスタム型をD-Busシステムに登録
    qRegisterMetaType<Hoge>("Hoge");
    qDBusRegisterMetaType<Hoge>();
    DBusReceiver receiver;
    if (!setupDBusConnection(receiver)) {
        return -1;
    }
    qDebug() << "D-Bus server is running. Waiting for incoming messages...";
    return a.exec();
}
</syntaxhighlight>
<br>
<code>Q_DECLARE_METATYPE(カスタム型)</code>は、Qtのメタオブジェクトシステムにカスタム型を登録するためのマクロである。<br>
<br>
* 型の登録
*: この宣言により、カスタム型がQtのメタオブジェクトシステムに認識される。
*: これにより、Qtの様々な機能 (シグナル/スロットシステム、プロパティシステム等) でカスタム型を使用できるようになる。
*: <br>
* QVariantとの互換性
*: カスタム型をQVariantオブジェクトに格納、および、QVariant型から取り出すことが可能になる。
*: <br>
* シリアライゼーション
*: Qtの機能を使用してカスタム型のオブジェクトをシリアライズ (バイナリデータに変換)、デシリアライズ (バイナリデータから元のオブジェクトに戻す) することができるようになる。
*: <br>
* 型の安全性
*: コンパイル時の型チェックが可能になり、カスタム型を使用する時の型の安全性が向上する。
*: <br>
* qRegisterMetaTypeとの連携
*: <code>Q_DECLARE_METATYPE</code>と<code>qRegisterMetaType</code>を併用することにより、
*: Qtのスレッド間通信やイベントシステムでもカスタム型を安全に使用できるようになる。
*: <br>
* D-Busとの連携
*: D-Busシステムでカスタム型を使用する場合、この宣言により型情報が適切に処理される。
*: <br>
* 動的プロパティ
*: Qtの動的プロパティシステムでカスタム型を使用することが可能になる。
<br>
具体的な使用例を以下に示す。<br>
<syntaxhighlight lang="c++">
// シグナル / スロットでの使用
signals:
    void hogeChanged(const Hoge &newHoge);
// QVariant型での使用
Hoge myHoge;
QVariant variant = QVariant::fromValue(myHoge);
// D-Busでの使用
QDBusMessage message;
message << QVariant::fromValue(myHoge);
</syntaxhighlight>
<br>
<u>※注意</u><br>
<u><code>Q_DECLARE_METATYPE</code>はヘッダファイル内で使用して、</u><br>
<u>対応する<code>qRegisterMetaType</code>関数呼び出しは、一般的に、<code>main</code>関数内や型を使用する前に1度だけ行う必要がある。</u><br>
<br>
<u>このマクロを使用することにより、カスタム型がQtのシステムにシームレスに統合されて、D-Bus通信を含む様々なQtの機能で安全かつ効率的に使用できるようになる。</u><br>
<br><br>
<br><br>


574行目: 753行目:
  </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]]