Qt下D-Bus的具体运用(软键盘输入法的实现)

1、基本概念
D-Bus是一种高级的进程间通信机制,在Linux桌面为进程提供通信。是一种低开销、低延时的IPC,并被多种桌面环境(如 KDE、GNOME等)采用。
D-Bus是一个消息总线系统,其功能已涵盖进程间通信的所有需求,并具备一些特殊的用途。D-Bus是三层架构的进程间通信系统。
D-Bus作服务器端和客户端的不同:
服务器端:
1、申请总线连接
2、在总线上挂载服务器
3、在挂载的服务上注册一个执行服务的对象
客户端:
1、申请一个总线连接
2、创建接口,连接到要请求的服务上
3、正式发送请求
2、步骤详解
1、在Windows下运行,必须要先在Windows系统下安装DBus服务。直接安装就可以了。安装包
2、查看是不是DBus已经能够正常运行,在任务管理器里面看看是不是有dbus-daemon.exe应用程序正在运行。
这里写图片描述
3、如果没有,则要手动启动DBus服务。Win+R打开运行,输入cmd进入管理员命令界面;然后进入到[DBus-dir]/bin,输入命令:dbus-daemon –config-file=../etc/session.conf
这里写图片描述
这样就启动了DBus的session服务。接下来就是编译自己的程序。
4、构建好项目之后,首先运行Numpad项目,这样的话就会在DBus上注册服务和一个可执行服务的对象,如下图所示:
这里写图片描述
而且这时候会创建虚拟键盘的dll文件和对用的库文件,保存在[QT-dir]/plugins/platforminputcontexts目录下,会有一个A文件和.dll文件,只要存在这两个文件,以后只要是Qt写的程序,都能调用这两个文件,从而实现虚拟键盘的功能。
5、再运行Dialog项目,点击输入框的时候回自动跳出输入法,其中hide是虚拟键盘的隐藏,X是删除,点击123654,这几个数字会在相应的输入框中。
这里写图片描述
3.部分代码分析
1.首先来看一下整体代码结构,如图,Dialog就是一个最普通的主窗口,里面只有六个QLineEdit,没有其他的任何东西;Keboard和numpad是我写的两个服务,调用其中的任何一个都可以,区别只是界面的不同,前一个使用代码实现的键盘布局,后一个是直接在designer里拉控件布局,而创建D-Bus服务是一样的;最后一个子项目是用来new一个QDBusInterface来调用前面在服务上创建的对象和QD-Bus服务。
这里写图片描述
2.现在来看一下inputservice.cpp
这个类很简单,只有构造函数和析构,构造是在D-Bus上创建对象和服务,析构是释放。

#include "inputservice.h"
#include <QDBusConnection>
#include <QDebug>
InputService::InputService(QObject *object)
{
    QDBusConnection connect = QDBusConnection::sessionBus();
    if (!connect.registerService("com.jgq.input"))
    {
        qFatal("Unable to register at DBus");
        return;
    }
    if (!connect.registerObject("/input/numpad", object,
        QDBusConnection::ExportAllSignals | QDBusConnection::ExportAllSlots))
    {
        return;
    }
}
InputService::~InputService()
{
    QDBusConnection connect = QDBusConnection::sessionBus();
    connect.unregisterObject("/input/numpad");
    connect.unregisterService("com.jgq.input");
}

3.numpadplarforminputcontextplugin.cpp
这个类也比较简单,只有这一个函数

#include "numpadplarforminputcontextplugin.h"
#include <QDebug>

NumpadPlatformInputContext * NumpadPlatformInputContextPlugin::create(const QString &key, const QStringList &paramList)
{
    if( key == QLatin1String( "numpad" ) )
    {
        qDebug()<<"numpad input context plugin created"<<endl;
        return new NumpadPlatformInputContext;
    }
}
  1. numpadplatforminputcontext.cpp
    这个类是最重要的一个类
#include "numpadplatforminputcontext.h"
#include <QDebug>
#include <QWidget>
#include <QtDBus>
#include <QKeyEvent>
#include <QGuiApplication>
NumpadPlatformInputContext::NumpadPlatformInputContext() :
    focusObject(NULL)
{
//创建接口
    dbusInterface = new QDBusInterface("com.gq.input","/input/numpad", "local.numpad.KeyBoard",
                                       QDBusConnection::sessionBus(),this );
//    dbusInterface = new QDBusInterface("com.gq.input","/input/numpad", "local.Keyboard.Dialog",
//                                       QDBusConnection::sessionBus(),this );
    connect(dbusInterface, SIGNAL(commit(QString)), SLOT(keyboardCommit(QString)));
}

具体的我就不多啰嗦了,后来在网上发现一个完整的代码,感谢大神的分享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值