本文共 2806 字,大约阅读时间需要 9 分钟。
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#include 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"#includeNumpadPlatformInputContext * NumpadPlatformInputContextPlugin::create(const QString &key, const QStringList ¶mList){ if( key == QLatin1String( "numpad" ) ) { qDebug()<<"numpad input context plugin created"<
#include "numpadplatforminputcontext.h"#include#include #include #include #include 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)));}
具体的我就不多啰嗦了,后来在网上发现一个,感谢大神的分享。