将矩阵键盘加入到QT4中使用

来源:互联网 发布:怎么看网络计划图 编辑:程序博客网 时间:2024/05/29 19:48

         这个资料貌似不多,如果找的到貌似也不全,当然也可以将矩阵键盘做成插件到QT中,我实施了一下,还是因为资料不全,自己资质也有限,没能继续做下去,能使我做下去的也只有这种要耗费大量精力的简单重复劳动。下面开始讲一下我如何将矩阵键盘加入到QT4中使用的。

首先就是改qt的源文件,我改了/src/gui/embedded中的几个文件,他们分别是qkbddriverfactory.cpp(这个文件是用来加载你的键盘的),myqkbd_qws.h。myqkbd_qws.cpp(这两个文件分别是你自己写的键盘接口的头文件和源文件,当然使用这个的前提是你的键盘驱动已经可以使用了)。

http://blog.csdn.net/xzdwfwt111/article/details/4244640

http://blog.sina.com.cn/s/blog_6143523a0100st2z.html

#ifndef QKBDTTY_QWS_H#define QKBDTTY_QWS_H#include <QtGui/qkbd_qws.h>#ifndef QT_NO_QWS_KEYBOARD#ifndef QT_NO_QWS_KBD_TTYclass QWSMyKbPrivate;class QWSMyKeyboardHandler : public QWSKeyboardHandler{public:QWSMyKeyboardHandler(const QString &);virtual ~QWSMyKeyboardHandler();private:QWSMyKbPrivate *d;};#endif // QT_NO_QWS_KBD_TTY#endif // QT_NO_QWS_KEYBOARD#endif // QKBDTTY_QWS_H

这个是头文件。

#include "qkbdtty_qws.h"#if !defined(QT_NO_QWS_KEYBOARD) && !defined(QT_NO_QWS_KBD_TTY)#include <sys/types.h>#include <sys/stat.h>#include <sys/ioctl.h>#include <fcntl.h>#include <termios.h>#include <unistd.h>#include <errno.h>#include <private/qcore_unix_p.h>#include <qsocketnotifier.h>class QWSMyKbPrivate : public QObject{Q_OBJECTpublic:QWSMyKbPrivate(QWSMyKeyboardHandler *handler, const QString &device);~QWSMyKbPrivate();bool isOpen() { return buttonFD > 0; }private Q_SLOTS:void readKeyboardData();private:QWSMyKeyboardHandler *m_handler;QString terminalName;int buttonFD;int kbdIdx;int kbdBufferLen;unsigned char *kbdBuffer;QSocketNotifier *notifier;};QWSMyKeyboardHandler::QWSMyKeyboardHandler(const QString &device): QWSKeyboardHandler(device){d = new QWSMyKbPrivate(this, device);}QWSMyKeyboardHandler::~QWSMyKeyboardHandler(){delete d;}QWSMyKbPrivate::QWSMyKbPrivate(QWSMyKeyboardHandler *h, const QString &device): m_handler(h){terminalName = device.isEmpty()?"/dev/atao_button":device.toLatin1();buttonFD = -1;notifier = 0;if ((buttonFD = QT_OPEN(terminalName.toLatin1().constData(), O_RDONLY | O_NDELAY)) < 0){qWarning("Cannot open %s\n", terminalName.toLatin1());}printf("open /dev/atao_button OK!\tbuttonFD=%d\n",buttonFD);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;}QWSMyKbPrivate::~ QWSMyKbPrivate(){if ( buttonFD > 0 ){::close( buttonFD );buttonFD = -1;}delete notifier;notifier = 0;delete [] kbdBuffer;;}void QWSMyKbPrivate::readKeyboardData(){int n = 0;int idx = 0;n = read(buttonFD, kbdBuffer+kbdIdx, 4);unsigned char *next = kbdBuffer + idx;int *code = (int *)next;int keycode = Qt::Key_unknown;int unicode = 0;switch ( (*code) & 0xff ){case 0:keycode = Qt::Key_0;unicode='0';break;case 1:keycode = Qt::Key_1;unicode='1';break;case 2:keycode = Qt::Key_2;unicode='2';break;case 3:keycode = Qt::Key_3;unicode='3';break;case 4:keycode = Qt::Key_4;unicode='4';break;case 5:keycode = Qt::Key_5;unicode='5';break;case 6:keycode = Qt::Key_6;unicode='6';break;case 7:keycode = Qt::Key_7;unicode='7';break;case 8:keycode = Qt::Key_8;unicode='8';break;case 9:keycode = Qt::Key_9;unicode='9';break;case 10:keycode = Qt::Key_Enter;break;case 11:keycode = Qt::Key_Escape;break;case 12:keycode = Qt::Key_Tab;break;case 13:keycode = Qt::Key_Backspace;break;case 14:keycode = Qt::Key_Right;break;case 15:keycode = Qt::Key_Left;break;default:qDebug("Unrecognised key code %d", *code );}m_handler->processKeyEvent( unicode, keycode, 0, TRUE, FALSE );m_handler->processKeyEvent( unicode, keycode, 0, FALSE, FALSE);// m_handler->processKeyEvent( 0, keycode, 0, TRUE, FALSE );}

#include "qkbdtty_qws.moc"

#endif // QT_NO_QWS_KEYBOARD ||QT_NO_QWS_KBD_TTY


这个是源文件。

以上两段代码没有什么问题,主要是之前的作者把它直接覆盖了qkbdtty_qws.h和qkbdtty_qws.h这两个文件,我没有这样做,自己新建了文件,但是这样就涉及到一个问题:这个键盘要到qkbddriverfactory.cpp下注册才能使用,我仿照qkbdtty_qws.h和上面的参考资料注册了一下。

#ifndef QT_NO_MYKBD

      if ( driver == “mykbd” || driver.isEmpty() )(这段代码看自己的程序)

            return new MyKbdHandler( device );

#endif

注册完了可以开始make&make install了,但是前提是必须在make之前修改Makefile文件,因为增加了myqkbd_qws.h和myqkbd_qws.cpp文件,必须增加它们到Makefile里面,当然由于在这我增加的文件的地位和qkbdtty_qws.h及qkbdtty_qws.cpp地位相当,因此在有qkbdtty_qws.h和qkbdtty_qws.cpp的地方就模仿写一下自己文件的依赖就可以了。

最后就可以make&make install了。

在编QT程序的时候,主要用到libQTGui.so开头的动态文件,把他们放到开发板中去,头文件用到的是include/QTGui中的文件。我增加了myqkbd_qws.h文件,在文件中写入了真正的该文件的地址,这样Qt程序就可以找到这个头文件了,那么Qt也就可以响应矩阵键盘了。

最最后还要在开发板上设置环境变量:export QWS_KEYBOARD=MYKBD:/dev/mykeyboard

原创粉丝点击