基于Qt的嵌入式虚拟键盘设计与实现
2020-08-20吕泽
吕 泽
(山西大众电子信息产业集团有限公司,山西 太原 030024)
0 引言
随着交互技术的发展,触摸交互方式已取代传统的键盘、鼠标等输入方式。虚拟键盘作为触摸屏上的重要信息输入工具,代替了传统的机械键盘,通过点击触摸屏上的按键完成数字、符号等内容的输入。
Qt是跨平台C++图形用户界面应用程序开发框架,它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展以及一些宏,并且允许真正地组件编程。Qt支持桌面操作系统和嵌入式操作系统[1]。本文介绍了基于Qt设计和实现的虚拟键盘,以及设计流程,该虚拟键盘具有操作方便的特点,可以实现字母、数字、删除等多种输入方式,并且能够应用于基于Linux操作系统的触摸屏设备。
1 虚拟键盘设计原理
1.1 Qt鼠标键盘事件
事件是对各种应用程序需要知道的由应用程序内部或者外部产生的事情或者动作的总称,一个事件可以是单独的事件类型,也可以包含多个事件类型。在Qt中事件有定时器事件QTimerEvent、键盘事件QKeyEvent、上下文菜单事件QContextMenuEvent、关闭事件QCloseEvent等。
QMouseEvent是Qt中的鼠标事件,例如,在窗口中,当按下鼠标左右键或移动鼠标都会产生QMouseEvent。通过该事件可以得到当前鼠标左右键按下状态、鼠标移动位置等信息。对于处理鼠标事件的函数来说,通常进行重定义部件以完成自定义的操作。鼠标的滚轮事件用QWheelEvent表示,该事件能得到鼠标滚轮移动的距离、方向。除QMouseEvent事件外,还有描述键盘的QKeyEvent事件,当键盘上的某个按键被按下或释放时,将会发送键盘事件给调用键盘输入焦点的部件[2]。
1.2 Qt通信机制
虚拟键盘对象之间通信采用Qt的通信机制,Qt的通信机制是信号-槽,信号-槽是一种高级接口,主要用来实现对象间通信,这种通信机制取代了传统的回调函数方式,实现了对象间灵活的传递消息,具有更高的安全性。在该通信机制中,当某个控件状态发生变化时,相应的控件就会发射(emit)一个信号(signal),而与该信号进行连接(connect)的信号槽(slot)负责监视接收信号,因此,当一个信号被发射时,与其相连接的信号槽将被调用,执行信号槽里面的相应操作[3]。而信号与槽的关系不只是简单的一对一模式,还存在一对多、多对一、多对多、信号触发信号的情况,如果存在一个信号与多个信号槽之间进行连接,则会使相关的信号槽都会被触发,并且执行的顺序是随机的。信号-槽具体关系模型如图1所示。
图1 Qt关系模型
虽然,信号-槽具有很好的执行效率,但是,与回调函数相比,还是存在一定的缺点,所以应注意信号-槽的使用。在自定义信号槽时,要避免间接地形成死循环。
2 虚拟键盘的界面设计
本文的虚拟键盘是在Linux操作环境下使用Qt设计的键盘,根据实际项目需求,确定键盘大小、按键个数、按键大小、按键位置等属性,并且点击主界面的LineEdit弹出虚拟键盘,能够进行信息输入,将所输入信息更新至主界面的LineEdit。虚拟键盘的按键包含功能键和输入键,其中,功能键包括Backspace(删除)、Clr(清除)、Enter(确定)、Esc(退出),输入键包括数字、字母、小数点。键盘布局图如图2所示。
图2 键盘布局图
本文设计的虚拟键盘主要采用Qt的QApplication、QPushButton、QWidget、QpushButtonGroup、QLineEdit及自定义类实现,通过QGridLayout设计虚拟键盘界面,调用setLayout()、addWidget()、setText()、setFixedsize()等函数实现按键整体布局。
3 虚拟键盘的实现
基于Qt的虚拟键盘设计如下:
1) 在工程自定义编辑框源文件中,从QLineEdit派生一个InputLineEdit类,重写鼠标点击事件,并且点击输入框发送LineEdit_Show(QString str)信号,用来显示虚拟键盘,自定义编辑框设计流程如图3所示。
图3 自定义编辑框设计流程图
2) 在工程虚拟键盘源文件中分别创建QWidget对象KeyboardWidget、QPushButton对象KeyButton、InputLineEdit对象KeyLineEdit、QLayout对象KeyboardLayout。根据项目界面需求,对虚拟键盘的界面进行设计,同时将KeyboardWidget的边框和标题栏进行隐藏,达到虚拟键盘能够进行拖拽操作。点击虚拟键盘的Enter按键发送SendMessage(QString data)信号,此信号用来将键盘上输入结果送至主界面输入框。虚拟键盘设计流程如图4所示。
图4 虚拟键盘设计流程图
由于传统的虚拟键盘是对每个QPushButton添加click信号,并且在各自对应的信号槽中实现按键功能,此方法设计的代码虽然可实现功能,但会造成代码数量大,执行效率慢。为了减少代码冗余,利用Button的属性和按键数组对信号和信号槽进行关联。
3) 在工程主界面源文件中创建InputLineEdit对象KeyLineEdit,设置KeyLineEdit的大小、样式等属性,对KeyLineEdit添加sender()命令,用于判断虚拟键盘的调用者。在该源文件中添加LineEdit_Show信号对应的槽,用于将调用者与虚拟键盘显示界面进行关联,同时,添加SendMessage信号对应的信号槽,将虚拟键盘的输入信息更新到主界面的编辑框中,完成虚拟键盘的输入功能。编辑框调用键盘设计流程如图5所示。
图5 编辑框调用键盘设计流程图
4 结束语
本文通过基于Qt设计的虚拟键盘,运行环境为Linux操作系统,可以在核心板imx6上进行移植,以及在触摸屏设备上测试成功,能够有效地、简单地替代机械键盘,为具有嵌入式系统的设备提供更经济、更合适的服务。