博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt下D-Bus的具体运用(软键盘输入法的实现)
阅读量:4186 次
发布时间:2019-05-26

本文共 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"#include 
NumpadPlatformInputContext * NumpadPlatformInputContextPlugin::create(const QString &key, const QStringList &paramList){ if( key == QLatin1String( "numpad" ) ) { qDebug()<<"numpad input context plugin created"<
  1. numpadplatforminputcontext.cpp
    这个类是最重要的一个类
#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)));}

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

你可能感兴趣的文章
Android——利用手机端的文件存储和SQLite实现一个拍照图片管理系统
查看>>
图像调优1:清晰度相关参数MTF,SFR,MTF50,MTF50P 以及TVL的概念以及换算说明
查看>>
图像调优3: CCM参数的标定
查看>>
ctags在verilog代码浏览中的应用
查看>>
NeoVintageous 在sublime中的使用
查看>>
用ncverilog跑仿真时,如何去除对特定路径的timing检查
查看>>
在ncverilog仿真条件设置中+nospecify ,+notimingcheck 和 +delay_mode_zero之间有什么区别
查看>>
linux下nerdtree安装方法
查看>>
最长回文子串(Go,LeetCode)
查看>>
windows下TortoiseGit安装和使用的图文教程
查看>>
基于Jquery的(可视区域,向上滚动向下滚动两种)图片懒加载
查看>>
原生JS的(可视区域,向上滚动向下滚动两种)图片懒加载
查看>>
使用VMware搭建Hadoop集群虚拟网络配置
查看>>
解决vmware下拷贝主机后不识别eth0网卡
查看>>
Promise简单实践
查看>>
vue中无缝轮播简单实现
查看>>
ES5和ES6中的类定义区别
查看>>
利用解构赋值快速提取对象参数
查看>>
CSS3简单实现360deg旋转
查看>>
vue中使用H5的audio
查看>>