classMyKbdPrivate : public QObject
{
Q_OBJECT
public:
MyKbdPrivate( MyKbdHandler *h, const QString& );
virtual ~MyKbdPrivate();
bool isOpen() { return buttonFD > 0; }
privateslots:
void readKeyboardData();
private:
QString terminalName;
int buttonFD;
int kbdIdx;
int kbdBufferLen;
unsigned char *kbdBuffer;
QSocketNotifier *notifier;
MyKbdHandler *handler;
};
MyKbdPrivate::MyKbdPrivate(MyKbdHandler *h, const QString &device ) : handler(h)
{
terminalName = device.isEmpty()?"/dev/mykeyboard":device.latin1();
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;
}
MyKbdPrivate::~ MyKbdPrivate()
{
if ( buttonFD > 0 ) {
::close( buttonFD );
buttonFD = -1;
}
delete notifier;
notifier = 0;
delete [] kbdBuffer;
}
voidMyKbdPrivate::readKeyboardData()
{
intn = 0;
intidx = 0;
n= read(buttonFD, kbdBuffer+kbdIdx, 4);
unsigned char *next = kbdBuffer + idx;
int *code = (int *)next;
int keycode = Qt::Key_unknown;
switch ( (*code) & 0xff ) {
case 11:
keycode = Qt::Key_Backtab;
break;
case 12:
keycode = Qt::Key_Return;
break;
case 13:
keycode = Qt::Key_Tab;
break;
case 14:
keycode = Qt::Key_Up;
break;
case 15:
keycode = Qt::Key_Down;
break;
default:
qDebug("Unrecognised key code %d", *code );
}
handler->processKeyEvent( 0, keycode, 0, TRUE, FALSE );
}
MyKbdHandler::MyKbdHandler(const QString &device)
{
d = new MyKbdPrivate( this, device );
}
MyKbdHandler::~MyKbdHandler()
{
delete d;
}
#include"mykbd_qws.moc"
#endif// QT_NO_MYKBD
2、把MyKbdHandler加入QkbdDriverFactory::create()函数中。在src/embedded/qkbddriverfactory_qws.cpp文件中加入头文件:
#include “mykbd_qws.h”
然后找到QkbdDriverFactory::create()这个函数,在”Qstring driver = key.lower();”这一行的后面加上以下几行:
#ifndef QT_NO_MYKBD
if ( driver == “mykbd” || driver.isEmpty() )
return new MyKbdHandler( device );
#endif
3、重新编译QT/Embedded并把生成的qt库文件下载到开发板上,然后在目标板上设置系统变量,输入命令:exportQWS_KEYBOARD=’MYKBD:/dev/mykeyboard’。
至此QT3/Embedded的键盘设备接口已经完成。