QT QDbus

通过Dbus 总线,客户端调用服务端的槽函数
服务端

1.新建项目QdbusTestServer

在.pro工程中增加QT += dbus

2.新建类 Cal定义接口和函数add(),sub()

定义接口名com.example.dbus.Interface
Q_CLASSINFO(“D-Bus Interface”,”com.example.dbus.Interface”)

cal.h
#include "qobject.h"
class Cal : public QObject
{
    Q_OBJECT
    Q_CLASSINFO("D-Bus Interface","com.example.dbus.Interface")
public:
    Cal();
public slots:
    int add(int,int);
    int sub(int,int);
};

cal.cpp
#include "cal.h"

Cal::Cal() :QObject()
{

}

int Cal::add(int a, int b){

    return a+b;
}

int Cal::sub(int a, int b){
    return a-b;
}

3.生成xml接口文件,生成Adapter,Interface文件

qdbuscpp2xml -M cal.h -o com.example.dbus.xml
qdbusxml2cpp com.example.dbus.xml -a cal_adaptor
qdbusxml2cpp com.example.dbus.xml -p cal_interface
将生成的文件加到工程中
这里写图片描述

4.服务端创建QDBusConnection对象,注册服务和对象

  Cal *cal = new Cal();
    new InterfaceAdaptor(cal);
    QDBusConnection connection = QDBusConnection::sessionBus();
//注册服务名
    connection.registerService("com.example.dbus");
    //注册对象名
    connection.registerObject("/", cal);

运行QT程序,用q-dfeet检查服务是否注册成功
这里写图片描述
测试:
~$ dbus-send –session –print-reply –dest=com.example.dbus / com.example.dbus.Interface.add int32:5 int32:6
method return sender=:1.1707 -> dest=:1.1710 reply_serial=2
int32 11

客户端调用服务端的函数

1.新建工程QdbusTestClient

新建工程QdbusTestClient
在.pro中增加QT += dbus
增加要访问的接口文件cal_interface.h cal_interface.cpp

2.在main函数中

QDBusConnection connection = QDBusConnection::sessionBus();
    com::example::dbus::Interface *iface;//用interface新建一个iface接口
//参数:com.example.dbus 是服务端创建的服务名,参数:/ 为服务端创建的Object Path
//参数:connection 为申请的connection
//参数:w.parent() 为当前对象this
    iface = new com::example::dbus::Interface("com.example.dbus","/",
                                   connection,w.parent());

 QDBusPendingReply<int> posReply = iface->add(15,10);//调用服务端的接口函数
    posReply.waitForFinished();


     qDebug() << posReply.value(); //输出返回结果25

测试

$ dbus-monitor --session \ "type='method_call',interface='com.example.dbus.Interface'"


method call sender=:1.1837 -> dest=com.example.dbus serial=9 path=/; interface=com.example.dbus.Interface; member=add
   int32 15
   int32 10

总结:服务端引入文件cal_adapter.h cal_adapter.cpp
客户端引入文件cal_interface.h cal_interface.cpp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值