Qt DBus: зарегистрировать объект, реализующий несколько интерфейсов

Используя библиотеку Qt DBus, мне трудно зарегистрировать объект, реализующий несколько интерфейсов.

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

У меня есть реализация обоих интерфейсов с использованием множественного наследования С++.

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) );

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


person xtofl    schedule 19.03.2012    source источник


Ответы (2)


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

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

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

person alexisdm    schedule 19.03.2012
comment
Благодарю. Кажется, что, например. проект dbus-cxx лучше поддерживает несколько интерфейсов для каждого объекта. - person xtofl; 20.03.2012
comment
Вы не можете наследовать, но нет необходимости использовать множественное наследование QDBusAbstractAdaptor для реализации двух интерфейсов DBus. - person José Tomás Tocino; 05.01.2018

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

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

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

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

person José Tomás Tocino    schedule 04.01.2018