这个资料貌似不多,如果找的到貌似也不全,当然也可以将矩阵键盘做成插件到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_TTY class 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_OBJECT public: 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