我正在使用Qt D-Bus库与BlueZ服务进行交互。该平台是Linux OS。
我导出了/ org / bluez / hci0对象的DTD D-BUS对象内省,并添加了所需的注释(参见:qdbusxml2cpp unknown type)
请考虑以下XML代码段:
<method name="SetDiscoveryFilter">
<arg name="properties" type="a{sv}" direction="in" />
<annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="ProperyList"/>
</method>
<signal name="PropertiesChanged">
<arg name="interface" type="s" direction="in" />
<arg name="changed_properties" type="a{sv}" direction="in" />
<arg name="invalidated_properties" type="as" direction="in" />
<annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="InvalidatedProperties"/>
</signal>
方法“SetDiscoveryFilter”中的“properties”arg在信号“PropertiesChanged”(a {sv})中具有相同类型的“changed_properties”arg。
假设我想用两个不同的值来注释“properties”和“changed_properties”args。
根据答案qdbusxml2cpp unknown type,代理类需要有一个typedef,它在Qt上下文中定义“ProperyList”和“ChangedProperties”类型。
typedef QVariantMap PropertyList;
typedef QVariantMap ChangedProperties;
Q_DECLARE_METATYPE(PropertyList)
Q_DECLARE_METATYPE(ChangedProperties)
编译时,我遇到了与Q_DECLARE_METATYPE相关的“重新定义”错误。实际上,在“QVariantMap”类型的两种类型的注册中存在问题。
处理这种情况的正确方法是什么?我是否要使用相同的值来注释DTD D-BUS对象内省中的所有“a {sv}”类型?
考虑上面的代码只是一个例子。我的Qt代码需要处理几个接口,其中类型“a {sv}”的参数在几个不同的上下文中使用。
可以抽象出“a {sv}”类型的解决方案吗?
考虑以下注释:
<annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="DbusQVariantMap"/>
注释是否可以接受或是否可以采用不同的解决方案?
答案 0 :(得分:1)
我发现的解决方案是使用单个QVariantMap typedef并定义两个额外的struct来包装此对象。
typedef QVariantMap DBusQVariantMap;
Q_DECLARE_METATYPE(DBusQVariantMap)
struct PropertyList
{
DBusQVariantMap propertyListMap;
};
Q_DECLARE_METATYPE(PropertyList)
struct ChangedProperties
{
DBusQVariantMap changedPropertiesMap;
};
Q_DECLARE_METATYPE(ChangedProperties)
该结构用作QVariantMap(QMap)的容器。有关DBusQVariantMap内容的信息详细说明了结构的名称。