版权声明:本文系作者原创。未经许可,不得转载。
参考文档:
在XML文件中,定义dbus的信号和槽函数,然后用qdbusxml2cpp工具生成代码。
用命令查看版本号,必须大于等于0.8,否则不支持新特性。
$ qdbusxml2cpp -V
qdbusxml2cpp version 0.8
D-Bus binding tool for Qt
XML解释如下:
name:参数名
direction: in为传入;out为传出
method: 槽函数
signal:信号函数
type:
s: string 对应于QT中的QString
b:bool 对应于QT中的bool
i:int32 对应于QT中的int
a:array 对应于QT中的QList
():struct 对应于QT中的QVariant 注:在信号函数中,不能用r表示struct。槽函数中可以。
as: 类型为string的array,对应于QT中的QStringList 或者 QList < QString >
ai: 类型为int32的array,对应于QT中的QList < int >
(ii): 类型为含有两个int32的struct。对应于QT中的QVariant
a(sss): 类型为struct的array, struct中包含三个string字段.对应于QT中的QVariantList
{sv}: 键值对 其中 key为string,value为Variant, 对应于QT中的QMap
a{sv}: 类型为键值对的数组,键值对中 key为string,value为VariantQVariantMap
复合类型必须使用annotation来指定dbus数据类型与QT数据类型的对应值
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
<interface name="cn.cmos.profiled">
<method name="get_profile">
<arg name="profile" type="s" direction="out"/>
</method>
<method name="has_profile">
<arg name="profile" type="s" direction="in"/>
<arg name="exists" type="s" direction="out"/>
</method>
<method name="set_profile">
<arg name="profile" type="s" direction="in"/>
<arg name="success" type="b" direction="out"/>
</method>
<method name="get_profiles">
<arg name="profiles" type="as" direction="out"/>
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QStringList"/>
</method>
<method name="get_keys">
<arg name="keys" type="as" direction="out"/>
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QStringList"/>
</method>
<method name="get_value">
<arg name="profile" type="s" direction="in"/>
<arg name="key" type="s" direction="in"/>
<arg name="value" type="as" direction="out"/>
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QStringList"/>
</method>
<method name="has_value">
<arg name="key" type="s" direction="in"/>
<arg name="exists" type="b" direction="out"/>
</method>
<method name="is_writable">
<arg name="key" type="s" direction="in"/>
<arg name="writable" type="b" direction="out"/>
</method>
<method name="set_value">
<arg name="profile" type="s" direction="in"/>
<arg name="key" type="s" direction="in"/>
<arg name="val" type="s" direction="in"/>
<arg name="success" type="b" direction="out"/>
</method>
<method name="get_type">
<arg name="profile" type="s" direction="in"/>
<arg name="key" type="s" direction="in"/>
<arg name="type" type="s" direction="out"/>
</method>
<method name="get_values">
<arg name="profile" type="s" direction="in"/>
<arg name="values" type="a(sss)" direction="out"/>
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QVariantList"/>
</method>
<signal name="profile_changed">
<arg name="change" type="b"/>
<arg name="active" type="b"/>
<arg name="profile" type="s"/>
<arg name="values" type="a(sss)"/>
<annotation name="org.qtproject.QtDBus.QtTypeName.In3" value="QVariantList"/>
</signal>
</interface>
</node>
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node name="/org/freesmartphone/GSM/Device">
<interface name="org.freesmartphone.GSM.SMS">
<method name="SendMessage">
<arg name="number" type="s"/>
<arg name="contents" type="s"/>
<arg type="i" direction="out"/>
</method>
<method name="windowInfo">
<arg type="i" direction="in"/>
<arg type="a{sv}" direction="out"/>
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QVariantMap"/>
</method>
<signal name="IncomingMessage">
<arg name="address" type="s"/>
<arg name="contents" type="s"/>
<arg name="features" type="a{sv}"/>
<annotation name="org.qtproject.QtDBus.QtTypeName.In2" value="QVariantMap"/>
<arg name="shit" type="ai"/>
<annotation name="org.qtproject.QtDBus.QtTypeName.In3" value="QList < int > "/>
<arg name="fuck" type="a(sss)"/>
<annotation name="org.qtproject.QtDBus.QtTypeName.In4" value="QVariantList"/>
</signal>
</interface>
</node>