2012-03-19 37 views
1

Qt DBusライブラリを使用すると、複数のインターフェイスを実装するオブジェクトを登録するのが苦労しています。Qt DBus:複数のインターフェイスを実装するレジスタオブジェクト

<node> 
    <interface name="x.I1"> <method name="foo"/> </interface> 
    <interface name="x.I2"> <method name="bar"/> </interface> 
</node> 

私はC++多重継承を使用して両方のインタフェースを実装しています。

class Impl : public x.I1, public x.I2 { 
public: 
    void foo(){} 
    void bar(){} 
}; 

qdbusxml2cppツールは私インターフェースのそれぞれについてDBusAdaptorを生成するが、QDBusConnectionは、そのオブジェクトへのインタフェースインプリを追加する方法がありません。

このオブジェクトをDBusサービスに公開したいとします。

QDBusConnection conn=QDBusConnection::sessionBus(); 
conn.registerObject("/obj",new DBusAdaptor????(&myObject)); 

私はこれを達成するために自分のアダプタを実装するを持ってますか?

答えて

2

あなたは彼ら自身が多重継承をサポートしていませんQObjectから継承するため、2つのQDBusAbstractAdaptorクラスから継承し、QtDBus Adaptor documentationからすることはできません。

クラスはまた、「Dと1つのQ_CLASSINFOエントリが含まれている必要があります-Bus Interface "という名前で、エクスポートするインターフェイスを宣言します。クラスあたり1つのエントリのみがサポートされています。

したがって、複数のインターフェイスをサポートするアダプタを実装することはできません。

+0

ありがとうございました。例えば、 dbus-cxxプロジェクトはオブジェクトごとに複数のインタフェースをサポートします。 – xtofl

+0

継承はできませんが、2つのDBusインターフェースを実装するためにQDBusAbstractAdaptorの多重継承を使用する必要はありません。 –

0

あなたの問題は、オブジェクトを登録する方法にあるようです。アダプターは登録しないでください。オブジェクト自体を登録する必要があります。また、デフォルトでは、アダプター内のエクスポート可能項目はDBus​​で公開されます。

あなたの例では、あなたがI1AdaptorI2Adaptorクラスを持っている場合、あなたがそれらをインスタンス化すると次のようにオブジェクトを登録するには:

new I1Adaptor(theObject); 
new I2Adaptor(theObject); 
QDBusConnection dbus = QDBusConnection::sessionBus(); 
dbus.registerObject("/obj", theObject); 

あなたはそのようにそれを行うならば、あなたは任意のDバスで両方のインターフェイスが表示されますデバッガ、d-feetなど。

関連する問題