QT D-Bus 复杂参数传递

网上一搜,关于D-Bus和QT的资料很多,可是绝大多数都对传递自定义数据类型这个问题闭口不谈。看来这个有必要写个文章记录一下。node

首先要说的是,我这里再也不介绍D-Bus和QDbus的基础知识,本文直击要点。另外本文参考了KDE的一些文档。函数

需求:使用标准的信号和槽,经过QDBus传递自定义的struct或者class数据类型。工具

首先,须要定义须要经过D-Bus传递的自定义数据类型,咱们这里定义一个Message类型:
#include <QtDBus>
 
class Message
{
public:代理

构造函数等略xml

friend QDBusArgument &operator<<(QDBusArgument &argument, const Message &message);接口

friend const QDBusArgument &operator>>(const QDBusArgument &argument, Message &message);文档

static void registerMetaType();
 
private:
    QString m_strMessage;
};
 
Q_DECLARE_METATYPE(Message)get

能够看到有几个比较特殊的地方:io

首先咱们重载了<<和>>两个运算符,这是将自定义数据类型融合到QT的类型系统所必需的:
QDBusArgument &operator<<(QDBusArgument &argument, const Message& message)
{
入门

argument.beginStructure();

argument << message.m_strMessage;

argument.endStructure();

return argument;
}
 
const QDBusArgument &operator>>(const QDBusArgument &argument, Message &message)
{

argument.beginStructure();

argument >> message.m_strMessage;

argument.endStructure();

return argument;
}

其次,这个自定义数据类型须要注册到QT和D-Bus的类型系统:
void Message::registerMetaType()
{

qRegisterMetaType<Message>("Message");

qDBusRegisterMetaType<Message>();
}

有了这个数据类型,就能够写描述D-Bus接口的XML文件了:

<!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="demo.Action">
        <signal name="messageSent">
            <arg name="message" type="a(i)" direction="out"/>
            <annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="Message"/>
        </signal>
        <method name="sendMessage">
            <arg name="message" type="a(i)" direction="in"/>
            <annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="Message"/>
        </method>
    </interface>
</node>

这里有两个特殊点,一个是参数的数据类型,由于是咱们自定义的,不存在于D-Bus规范中,因此参数的type在这里能够乱写。另外一个就是,既然是自定义的,就要说明这个自定义的数据类型究竟是啥(在这里是Message)。

OK,有了上面这些啰嗦的准备工做,下面调用QT自带的D-Bus工具,就能够自动生成相关的接口和代理类了:

qdbusxml2cpp Chat.xml -i Message.h -a MessageAdaptor

qdbusxml2cpp Chat.xml -i Message.h -p MessageInterface

后续就是标准的调用QDBus过程了,本文再也不废话,请参考其余入门资料。大致上就是这样:

接收:

connect(&m_MessageInterface, SIGNAL(messageSent(Message)), SLOT(onMessageSent(Message)));

发送:

Message message(…);

m_MessageInterface.sendMessage(message);

相关文章
相关标签/搜索