演示代码:点击打开链接
话说dbus-python很强大,可以通过python轻松地实现一个dbus服务,供其它程序调用或与之交互。那么如何让QT通过proxy方式调用python实现的dbus服务呢?
这就要借助dbus-python的inspect功能了。
比如通过dbus-python注册了一个名为com.foxbryant.demo的服务,通过d-feet查看结果如下:
一、生成D-Bus xml
将如下内容写到dbus-introspection.py,然后运行./dbus-introspection.py >demo.xml
详细可参考:https://en.wikibooks.org/wiki/Python_Programming/Dbus
#!/usr/bin/env python
import dbus
bus = dbus.SystemBus()
hal_manager_object = bus.get_object(
'com.foxbryant.demo', # service
'/Device' # published object
)
introspection_interface = dbus.Interface(
hal_manager_object,
dbus.INTROSPECTABLE_IFACE,
)
# Introspectable interfaces define a property 'Introspect' that
# will return an XML string that describes the object's interface
interface = introspection_interface.Introspect()
print interface
此方法适用于生成任何d-bus对象的D-Bus xml。
[补充]
嫌上述方法太麻烦? 当然有更简单的方法:
每个D-bus对象都有一个叫"org.freedesktop.DBus.Introspectable"的Interface(请看上面的附图), 一个简单的生成接口xml的方法是打开d-feet, 找到目标对象,展开org.freedesktop.DBus.Introspectable接口,里面有个"Introspect"的method,双击它,让后在弹出对话框中点击"Execute"就可以了.
二、使用qdbusxml2cpp工具从D-Bus xml生成QDBusInterface的类
qdbusxml2cpp demo.xml -p demo_interface
此命令会生成一个代表com.foxbryant.demo.Pcie Interface的类ComFoxbryantDemoPcieInterface,然后就可以在QT中通过此类定义对象并调用相关刻录等接口了。