在Qt/Embedded 2.3.8中添加MX21Ads键盘处理
经过查看源代码发现Qt的键盘处理是判断环境变量QWS_KEYBOARD再加载相应的键盘处理拦截类, 而qt已经包含了几个典型的键盘处理,只要以它们为蓝本即可编写自己的处理类! 一下我以 vr4xx为模板, 建立QWSMx21ButtonsHandler键盘处理类! 以下是相关实现代码,
2. 添加键盘处理类
class QWSMx21ButtonsHandler : public QWSKeyboardHandler
{
Q_OBJECT
public:
QWSMx21ButtonsHandler();
virtual QWSMx21ButtonsHandler();
bool isOpen() { return buttonFD > 0; }
private slots:
void readKeyboardData(); // 这个函数最重要, 包含的读键盘扫描码的处理
private:
QString terminalName;
int buttonFD;
int kbdIdx;
int kbdBufferLen;
unsigned char *kbdBuffer;
QSocketNotifier *notifier;
};
/*
* mx21 buttons driver
*/
QWSMx21ButtonsHandler::QWSMx21ButtonsHandler() : QWSKeyboardHandler()
{
terminalName = "/dev/buttons";
buttonFD = -1;
notifier = 0;
if ((buttonFD = open(terminalName, O_RDWR | O_NDELAY, 0)) < 0)
{
qWarning("Cannot open %s/n", terminalName.latin1());
}
if ( buttonFD >= 0 ) {
notifier = new QSocketNotifier( buttonFD, QSocketNotifier::Read, this );
connect( notifier, SIGNAL(activated(int)),this,
SLOT(readKeyboardData()) );
}
kbdBufferLen = 80;
kbdBuffer = new unsigned char [kbdBufferLen];
kbdIdx = 0;
}
QWSMx21ButtonsHandler::~QWSMx21ButtonsHandler()
{
if ( buttonFD > 0 ) {
::close( buttonFD );
buttonFD = -1;
}
delete notifier;
notifier = 0;
delete [] kbdBuffer;
}
void QWSMx21ButtonsHandler::readKeyboardData()
{
int n = 0;
do {
n = read(buttonFD, kbdBuffer+kbdIdx, kbdBufferLen - kbdIdx );
if ( n > 0 )
kbdIdx += n;
} while ( n > 0 );
int idx = 0;
while ( kbdIdx - idx >= 2 ) {
unsigned char *next = kbdBuffer + idx;
unsigned short *code = (unsigned short *)next;
if ( ( *code & 0x8000) != 0x8000) {
idx += 2;
continue;
}
int keycode = Qt::Key_unknown;
//在此添加键盘扫描码映射关系
switch ( (*code) & 0x00ff ) {
case 59:
keycode = Qt::Key_Up;
break;
default:
qDebug("Unrecognised key sequence %d", (int)code );
}
processKeyEvent( 0, keycode, 0, TRUE, FALSE );
idx += 2;
}
int surplus = kbdIdx - idx;
for ( int i = 0; i < surplus; i++ )
kbdBuffer[i] = kbdBuffer[idx+i];
kbdIdx = surplus;
}
2. 添加加载代码
src/kernel/qkeyboard_qws.cpp
/*
* keyboard driver instantiation
*/
QWSKeyboardHandler *QWSServer::newKeyboardHandler( const QString &spec )
{
QWSKeyboardHandler *handler = 0;
QString device;
QString type;
int colon=spec.find(':');
if ( colon>=0 ) {
type = spec.left(colon);
device = spec.mid(colon+1);
} else {
type = spec;
}
if ( type == "Buttons" ) {
#if defined(QT_QWS_YOPY)
handler = new QWSyopyButtonsHandler();
#elif defined(QT_QWS_CASSIOPEIA)
handler = new QWSVr41xxButtonsHandler();
#endif
} else if ( type == "QVFbKeyboard" ) {
handler = new QWSVFbKeyboardHandler();
} else if ( type == "USB" ) {
handler = new QWSUsbKeyboardHandler(device);
} else if ( type == "TTY" ) {
handler = new QWSTtyKeyboardHandler(device);
} else if ( type == "MX21" ) { //这是我们添加的MX21键盘处理类
handler = new QWSMx21ButtonsHandler();
} else {
qWarning( "Keyboard type %s:%s unsupported", spec.latin1(), device.latin1() );
}
return handler;
}
3.重新编译链接
在目标平台上只要设置QWS_KEYBOARD=MX21即可在界面中拦截到键盘事件处理!
这里只是给出了基本原理实现,具体的键盘扫瞄码映射关系得看具体的操作!
最新的qtopia-core 版本也可以参考Vr4xx 实现来做, 在src/gui/embedded/下!
希望对有需要的人有所帮助!
在Qt/Embedded 2.3.8中添加MX21Ads键盘处理相关推荐
- Windows 8.1中添加美式键盘
说明:这里将添加"简体中文(美式键盘)",也就是英文输入法,并设置为默认输入法 1.打开控制面板-时钟.语言和区域-语言,点击"添加语言",选择"英语 ...
- QT中添加图片资源的方法
1.在ui设计界面中添加label,用于显示图片 2.添加QT资源文件 往项目中添加新文件,选择QT分类中的资源文件,名称为"myImage",其他选项默认. 3.添加资源 在项目 ...
- Qt Creator和VS2010中添加槽信号_差异与详解
1.前言: Qt 的窗口部件通过发射信号(signal)来表明一个用户的动作已经发生了或者是一个状态已经改变了.如点击一个QPushButton时,按钮会发送一个clicked()信号,信号可以与函 ...
- 【转】QT中添加的资源文件qrc时的路径问题小结
@2019-06-13 [小记] QT中添加的资源文件qrc时的路径问题小结 转载于:https://www.cnblogs.com/skullboyer/p/11014943.html
- 在Qt Creator中添加OpenCV库
在项目的pro文件中添加如下代码: INCLUDEPATH += D:/opencv/build/include win32:CONFIG(debug, debug|release): { LIBS ...
- Qt解决资源文件中添加图片,对应控件不显示图片的问题
//资源文件--为控件添加图标//:/new/prefix1/image/mr.jpgQPixmap pic; //定义一个图片对象pic.load(":/new/prefix1/a.jpg ...
- 在Qt项目中添加pri文件
在Qt项目框架里,很多人都喜欢用pri文件来管理项目.那么今天就来讲讲这个pri文件. 目录 前言 创建pri文件的步骤 一.创建Qt项目 二.创建pri空文件 三.调试 前言 一般我们创建Qt项目工 ...
- Qt中添加背景图片的方法
Qt中添加背景图片的方法 QPalette的方法 #include #include int main(int argc, char *argv[]) { QApplication app(argc, ...
- 在Qt中添加菜单图标
第一步:新建Qt Widgets Application,取合适的项目名称,基类选择QMainWindow,类名为MainWindow. 第二步:创建完项目后,双击mainwindow.ui文件进入设 ...
- qt 二次开发 研华daq_在QT项目中添加对研华数采模块的支持
一.正确安装研华数采模块管理程序Advantech Device Manager,并安装相应模块驱动. 二.将C:\Program Files\Advantech\Adsapi路径(默认安装位置)下的 ...
最新文章
- AI+大数据助力抗疫,带你认识百度地图的新玩法!
- Jmeter响应内容显示乱码问题的解决办法
- WebKit 内核源码分析 (五)
- 语言nomogram校准曲线图_R语言实现Cox模型校准度曲线绘制
- mysql表空间转移_mysql共享表空间扩容,收缩,迁移
- 华为9x升级鸿蒙,荣耀9X升级鸿蒙2.0系统截图曝光:4G内存流畅度照样起飞!
- Kafka和Unix管道的示例
- iOS 实现搜索关键字高亮
- Android开发之数据库Sqlite
- vue利用Bscroll开发一个城市列表组件,带右侧字母导航栏
- DLL Care破解版|DLL Care(DLL修复工具)破解版下载(附激活码)
- Java实现阿里云域名动态解析,DDNS功能
- PhpStorm 2019 for mac(PHP集成开发工具) 2019.1.3中文激活版
- ideaij 按内容查找文件
- 计算机的发明还不到一百年 英语,考研英语作文万能句子25个.doc
- 计算机操作系统(第四版)第四章存储器管理—课后习题答案
- pve 缩小LXC 磁盘
- 网页病毒挂马原理解析
- H3 BPM 端到端流程解决方案 (附H3 BPM软件下载地址)
- 联想服务器测试项目,联想服务器集成测试系统iPTS今上线
热门文章
- 爬楼梯算法-java(递归与非递归)
- [2018.05.05 T2] 互质2
- [数据结构] 左偏树
- react-hooks学习笔记
- 按顺序发起多次请求的loading使用
- 关于winfrom中如何快速导出DataGridView数据到excel中的问题
- pl sql入门比较好的书_【赵强老师】什么是PL/SQL?
- sublime运行python_sublime交互执行python文件方法
- python按照日期筛选excel_用python判断Excel单元格格式为输出日期(日期字段位置不固定)的,按datetime格式输出日期(而非float)_python excle 日期列...
- java实参传空_java形参、实参、值传递、引用传递