qdbusxml2cpp unknown type

我的梦境 提交于 2019-12-05 11:31:18

openSUSE imagewriter is a GPL licensed project which contains an example of how to do this.
(Relevant files: udisks2_interface.*)


a{sv} is a dict of string:variant pairs.
QVariantMap would fit this signature.

a{sa{sv}} is a dict of string:a{sv} pairs.
QMap<QString, QVariantMap> would fit this signature.

a{oa{sa{sv}}} is a dict of objectpath:a{sa{sv}} pairs.
QMap<QDBusObjectPath, QMap<QString, QVariantMap>> would fit this signature.

We should hide those angle-brackets behind some typedefs in a header file:

typedef QMap<QString, QVariantMap> InterfaceList;
typedef QMap<QDBusObjectPath, InterfaceList> ManagedObjectList;

Then declare their QMetaTypes in the same header file:

Q_DECLARE_METATYPE(InterfaceList)
Q_DECLARE_METATYPE(ManagedObjectList)

Then register them with the Qt metatype system at runtime:

qDBusRegisterMetaType<InterfaceList>();
qDBusRegisterMetaType<ManagedObjectList>();

Then we can annotate the XML:

<method name="GetManagedObjects">
  <arg type="a{oa{sa{sv}}}" name="objects" direction="out">
    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="ManagedObjectList"/>
  </arg>
</method>
<signal name="InterfacesAdded">
  <arg type="o" name="object"/>
  <arg type="a{sa{sv}}" name="interfaces">
    <annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="InterfaceList"/>
  </arg>
</signal>
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!