Qt DBus:实现多个接口的寄存器对象

时间:2012-03-19 10:19:15

标签: c++ qt dbus multiple-interface-implem

使用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 个答案:

答案 0 :(得分:2)

你不能从2个QDBusAbstractAdaptor类继承,因为它们本身都是从不支持多重继承的QObject继承而来的,并且来自QtDBus Adaptor documentation

  

该类还必须包含一个带有“D-Bus接口”名称的Q_CLASSINFO条目,声明它正在导出哪个接口。每个类只支持一个条目。

因此,您无法实现支持多个接口的适配器。

答案 1 :(得分:0)

您的问题似乎在于您注册对象的方式。您不应该注册适配器,您应该注册对象本身,默认情况下,适配器中的可导出项目在DBus as per the docs中发布。

在您的示例中,如果您有I1AdaptorI2Adaptor类,则应实例化它们并按如下方式注册对象:

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

一旦你这样做,你就会在任何DBus调试器中看到两个接口,比如d-feet。