最近做了一个虚拟键盘的小Demo,分享给大家。

一般我在做一个东西之前会上网查找资料,看下有几种实现的方式。在Qt下开发虚拟键盘总体上可分为两种方式——进程内部和进程外部。

在进程内部,虚拟键盘可以是一个QWidget小部件,显示键盘按钮,对用户按下的按键生成键盘事件,之后让具有焦点的可输入的部件响应键盘事件。

在进程外部,虚拟键盘则可以被其他应用程序使用,不过这需要进程间通信。Qt上使用DBus作为IPC通讯方式,虚拟键盘被开发完成则是一个插件,需要放到Qt指定的目录下,Qt应用程序在使用虚拟键盘前需要注册一下,关于虚拟键盘和插件以后我们有机会会介绍的。今天展示的是在进程内部开发虚拟键盘的方式。

我最终想要实现的是点击任何可输入部件键盘都可以弹出来,但是开发的过程中发现可输入部件没有在被点击后发出信号或事件,最后只好用窗体的鼠标事件来替代。

提几个项目中会遇到的问题:

①像键盘这种有众多按钮的窗体,如何创建按钮及其信号和槽

②响应按钮后如何转换为键盘事件,事件的接收者是谁

③希望键盘随着窗体焦点移动而移动

有些问题我是没有解决的,这次和大家分享的是虚拟键盘的初版,以后会有更新。使用插件开发键盘上面考虑的问题插件都预留了接口,不用像自己开发这样要考虑诸多问题,不过同样也知道了很多知识。

程序平台: ubuntu Qt 5.5.1

KeyBoard 类

该类继承QWidget,是键盘窗体的实现类,有以下几个对外接口

void showKeyboard(int globalX, int globalY);

void hideKeyboard();

void setFocusWidget(QWidget *focusWidget);

分别是键盘的显示、隐藏以及生成键盘事件的接收对象。

众多键盘按钮的布局,主要使用QSignalMapper。为方便阅读,使用的数据结构没有列出

KeyBoard::KeyBoard(QWidget *parent) : QWidget(parent)

{

QGridLayout *gridLayout = new QGridLayout(this);

QSignalMapper *mapper = new QSignalMapper(this);

connect(mapper, SIGNAL(mapped(int)), SLOT(buttonClicked(int)));

m_focusWidget = parent;

this->setStyle("#E4E4E4", "#A2A2A2", "#DCDCDC", "#000000");

int row = 0;

int column = 0;

for (int i = 0; i < layoutSize; ++i) {

if (keyboardLayout[i].key == NEXT_ROW_MARKER)

{

row++;

column = 0;

continue;

}

QPushButton *button = new QPushButton;

button->setFixedWidth(40);

button->setText(QString::fromLatin1(keyboardLayout[i].label));

mapper->setMapping(button, keyboardLayout[i].key);

connect(button, SIGNAL(clicked()), mapper, SLOT(map()));

gridLayout->addWidget(button, row, column);

column++;

}

}

生成键盘事件

void KeyBoard::buttonClicked(int key)

{

QKeyEvent *keyPressEvent = NULL;

if ((key == Qt::Key_Enter) || (key == Qt::Key_Backspace))

keyPressEvent = new QKeyEvent(QEvent::KeyPress, key,

Qt::NoModifier);

else

keyPressEvent = new QKeyEvent(QEvent::KeyPress, key,

Qt::NoModifier, keyToCharacter(key));

if (keyPressEvent != NULL)

{

QGuiApplication::postEvent(m_focusWidget, keyPressEvent);

}

}

用户界面调用

主要重新实现了鼠标点击事件,将位置发送给键盘显示函数

void Widget::mousePressEvent(QMouseEvent *event)

{

if( event->type()== QEvent::MouseButtonPress )

{

qDebug()<

if(event->pos().x()<= pos().x())

{

m_keyboard->showKeyboard(this->pos().x(),this->y() +

this->frameGeometry().height());

}

}

}

总结:

①没有找到获取当前编辑框焦点的方法,QWidget中有焦点改变的信号,还有事件过滤 器,接下来会从这两方面入手。

②QLineEdit等编辑框没有响应鼠标点击的信号或事件,需要重新继承实现。

最后效果如图:

ubuntu下qt模拟键盘按键按下_Qt 项目之虚拟键盘相关推荐

  1. QT防止锁屏工具(QT模拟Windows按键按下)

    有些公司可能会对员工使用的电脑进行加域控制.如长时间无操作,熄灭屏幕并自动锁定.长时间无使用自动关机等控制.且不能进行个性化设置.有时与同事讨论问题,一段时间没有操作电脑就会导致进入锁定状态,必须重新 ...

  2. ubuntu下qt模拟键盘按键按下_基于QT的跨平台虚拟键盘设计与实现

    摘  要: 针对QT在Windows.Linux.以及嵌入式Linux-arm等不同平台下没有开源.高效的虚拟键盘(包含中文输入法),以及QT版本升级造成代码不兼容等问题,设计并实现了一个跨平台的虚拟 ...

  3. c/c++ 模拟键盘按键按下

    写个程序模拟用户按下某个键 获取按键状态: GetKeyState( [in] int nVirtKey )函数是获取某个按键的状态,nVirtKey对应的按键参数为VK_开头的宏定义.若为1则为按下 ...

  4. python编程midi键盘按键_python 偷懒技巧——使用 keyboard 录制键盘事件

    之前在某本书上看到一个程序,可以通过 Python 记录下全局范围内的键盘事件,使用的是 ctypes 库. 后来几经尝试,始终不能成功运行.原来它只支持 Python2 和 32 位的 Window ...

  5. [QDialog]qt虚拟键盘的实现以及qdateedit实现打开虚拟键盘

    一.虚拟键盘的拖动 首先,实现虚拟键盘的拖动功能就需要对QDialog的鼠标事件进行重写,所以就需要自己写一个继承于QDialog的子类. 这里代码参考qt实现窗口拖动的两种思路_肩上风骋的博客-CS ...

  6. android平板电脑的虚拟键盘,触控、手写、虚拟键盘的操作体验

    ·触控.虚拟键盘的操作体验 谈到操作体验,它与系统UI设计紧密相连,戴尔Streak采用了我们熟悉的Android操作系统,该系统对触控操作有较好的优化,特别是一些细节之处,譬如菜单图标的操作方面,大 ...

  7. android 无法隐藏键盘,我无法在Android上隐藏虚拟键盘

    我正在使用支持库处理片段和嵌套片段.我无法在Android上隐藏虚拟键盘 我有一个场景,我从现有的片段中添加一个新的片段(其中包含一个EditText).当用户点击EditText时,会显示一个虚拟键 ...

  8. android平板电脑的虚拟键盘,win10平板电脑不弹出虚拟键盘的两种解决方法

    平板电脑升级到了最新版Windows10系统后,发现在开机的时候没有弹出虚拟键盘,这样就没办法打字了,此问题对我们来说其实是比较少见的,如果真的出现这样的情况怎么办?今天小编就为大家整理了win10平 ...

  9. xcode6的项目中虚拟键盘无法弹出

    这是因为Xcode6中的模拟器键盘设置跟之前的版本不一样了.之前版本是模拟器的键盘和电脑的键盘都可以使用,但是Xcode6的模拟器键盘只能使用一种,即要么是模拟器键盘,要么是电脑键盘. 快捷键切换键盘 ...

  10. ubuntu下qt模拟键盘按键按下_基于Linux+Qt软键盘设计及其实现.pdf

    计算机与现代化 YUXIANDAIHUA 2011年第12期 JISUANJI 总第196期 文章编号:1006-2475(2011)12-0179-03 基于Linux Qt的软键盘设计与实现 田福 ...

最新文章

  1. Hibernate in action阅读笔记-吵吵冷饭-ORM
  2. Linux下常用的命令
  3. 双智机器人 珠海_美的集团:“双智”战略加速推行,加强发展机器人业务
  4. 雅诗兰黛天猫超级品牌日:未央唇膏、红装小棕瓶“当红不让”
  5. 为什么要进行归一化处理?(从寻找最优解这个角度讨论)
  6. c++ 快速排序_常用排序算法之快速排序
  7. 50+企业数字化转型、管理的方法论,这本书到底有什么干货?
  8. WPF程序模彷Windows7的桌面任务栏
  9. 为什么老是把词语读反_关于语言表达 6岁儿童经常把词语顺序念反
  10. Tensorflow基础语法和概念
  11. mysql能将查询结果与表左查询_mysql重点,表查询操作和多表查询
  12. 安全测试-Drozer安全测试框架实践记录篇
  13. av_rescale_rnd计算原理
  14. html怎么动态背景,HTML 动态背景
  15. 最新公路测量计算机,公路施工测量坐标计算系统
  16. 为XYplorer添加右键菜单:“使用XYplorer打开”
  17. 哈勃(Hubble)太空望远镜:人类的大眼睛
  18. python pcm 静音_使用静音检测分割音频文件
  19. 状态模式(状态变化)
  20. 运维工程师分享7道经典面试题

热门文章

  1. 数据分析案例-电影数据可视化分析
  2. sharepoint文件夹本地同步_DIY游戏云存档 - 单机游戏存档多机异地同步方案
  3. Word文档怎样转化为pdf格式
  4. CSDN博客图片去水印
  5. JavaScript实现气球打字游戏
  6. 异地如何在北京换驾照
  7. 2019 计蒜之道 初赛 第三场 阿里巴巴协助征战SARS(python做法,费马小定理+快速幂)
  8. 不用第三方实现外网访问
  9. 什么是MKV文件以及如何打开和播放MKV?
  10. 手机QQ邮箱可以发html邮件么,如何使用手机qq邮箱发送邮件