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

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

你可能感兴趣的:(delete,qt,button,makefile,Signal,keyboard)