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 ответа

Решение

Вы не можете наследовать от 2 классов QDBusAbstractAdaptor, потому что они сами наследуются от QObject который не поддерживает множественное наследование, и из документации адаптера QtDBus:

Класс также должен содержать одну запись Q_CLASSINFO с именем "Интерфейс D-Bus", указывающую, какой интерфейс он экспортирует. Поддерживается только одна запись на класс.

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

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

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

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

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

Другие вопросы по тегам