2012-03-19 2 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 не имеет метод, чтобы добавить интерфейс Implementor к этому объекту.

И я хочу опубликовать этот объект в службе DBus.

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

У меня есть реализовать свой собственный адаптер для достижения этой цели?

ответ

2

Вы не можете наследовать от 2-х классов QDBusAbstractAdaptor, потому что они сами по себе наследовать от QObject, который не поддерживает множественное наследование, и от QtDBus Adaptor documentation:

Класс должен также содержать одну запись Q_CLASSINFO с «D -Bus Interface ", объявив, какой интерфейс он экспортирует. Поддерживается только одна запись для каждого класса.

Таким образом, вы не можете реализовать себе адаптер, поддерживающий несколько интерфейсов.

+0

спасибо. Кажется, что, например, проект dbus-cxx лучше поддерживает несколько интерфейсов на объект. – xtofl

+0

Вы не можете наследовать, но нет необходимости использовать множественное наследование QDBusAbstractAdaptor для реализации двух интерфейсов DBus. –

0

Ваша проблема заключается в том, что вы регистрируете объект. Вы не должны регистрировать адаптер, вы должны зарегистрировать сам объект, и по умолчанию экспортируемые элементы в адаптере публикуются в DBus, as per the docs.

В вашем примере, если у вас есть I1Adaptor и I2Adaptor классы, вы должны создать экземпляр их и зарегистрировать объект следующим образом:

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

После того, как вы делаете это так, вы будете видеть оба интерфейса в любом DBus отладчик, например, d-foot.

Смежные вопросы