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.