最近开发一个小项目用QT作为gui, 在s3c2410上跑linux+Qt 程序。
第1步: 在qte-3.3.8b/src/embedded目录下建立建立两个文件。
qkbds2410kpad_qws.cpp qkbds2410kpad_qws.h
qkbds2410kpad_qws.h 的内容如下:
#ifndef QKBDS2410KPAD_QWS_H
#define QKBDS2410KPAD_QWS_H
#ifndef QT_H
#include "qkbd_qws.h"
#endif // QT_H
#ifndef QT_NO_QWS_KBD_S2410KPAD
class QWSS2410KpadPrivate;
class QWSS2410KpadKeyboardHandler : public QWSKeyboardHandler
{
public:
QWSS2410KpadKeyboardHandler(const QString&);
virtual ~QWSS2410KpadKeyboardHandler();
private:
QWSS2410KpadPrivate *d;
};
#endif // QT_NO_QWS_KBD_S2410KEYPAD
#endif // QKBDS2410KPAD_QWS_H
qkbds2410kpad_qws.cpp的内容如下:
[pre]#include "qkbds2410kpad_qws.h"#ifndef QT_NO_QWS_KBD_S2410KPAD#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 <qsocketnotifier.h>class QWSS2410KpadPrivate : public QObject{ Q_OBJECTpublic: QWSS2410KpadPrivate( QWSS2410KpadKeyboardHandler *h, const QString& ); virtual ~QWSS2410KpadPrivate(); bool isOpen() { return buttonFD > 0; }private slots: void readKeyboardData();private: QString terminalName; int buttonFD; int kbdIdx; int kbdBufferLen; unsigned char *kbdBuffer; QSocketNotifier *notifier; QWSS2410KpadKeyboardHandler *handler;};QWSS2410KpadPrivate::QWSS2410KpadPrivate(QWSS2410KpadKeyboardHandler *h, const QString &device ) : handler(h){ terminalName = device.isEmpty()?/dev/s2410kpad":device.latin1(); buttonFD = -1; notifier = 0; if ((buttonFD = open(terminalName, O_RDWR | O_NDELAY, 0)) { //qWarning("Cannot open %s\n", terminalName.latin1()); qDebug("Cann't 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;}QWSS2410KpadPrivate::~QWSS2410KpadPrivate(){ if ( buttonFD > 0 ) { ::close( buttonFD ); buttonFD = -1; } delete notifier; notifier = 0; delete [] kbdBuffer;}void QWSS2410KpadPrivate::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; switch ( (*code) & 0xff ) { case 1:keycode = Qt::Key_Left;break; case 2:keycode = Qt::Key_Right;break; case 3:keycode = Qt::Key_Up;break; case 4:keycode = Qt::Key_Down;break; case 5:keycode = Qt::Key_Plus;break; case 6:keycode = Qt::key_Minus;break; case 7:keycode = Qt::Key_Page;break; case 8:keycode = Qt::Key_C;break; default:qDebug("Unrecognised key code %d", *code ); } handler->processKeyEvent( 0, keycode, 0, TRUE, FALSE );}QWSS2410KpadKeyboardHandler::QWSS2410KpadKeyboardHandler(const QString &device){ d = new QWSS2410KpadPrivate( this, device );}QWSS2410KpadKeyboardHandler::~QWSS2410KpadKeyboardHandler(){ delete d;}#include "qkbds2410kpad_qws.moc"#endif // QT_NO_QWS_KBD_2410KEYPAD[/pre] 第2步: 修改qkbddriverfactory_qws.cpp文件, 在
QWSKeyboardHandler *QKbdDriverFactory::
create(
const QString& key,
const QString& device )
{ QString driver = key.
lower();
后面添加如下几行代码
[pre]#ifndef QT_NO_QWS_KBD_S2410KPAD if ( driver == "s2410kpad" || driver.isEmpty() ) return new QWSS2410KpadKeyboardHandler( device );#endif[/pre][pre]在[pre]QStringList QKbdDriverFactory::keys(){ QStringList list;[/pre][pre]后面加入下面几行代码[/pre][pre][pre]#ifndef QT_NO_QWS_KBD_S2410KPAD if ( !list.contains( "S2410KPAD" ) ) list << "S2410KPAD";#endif[/pre][pre]第三步:重编译qte-3.3.8b, 配置命令如下:[/pre][pre]./configure -qt-gif -qt-zlib -no-fast -xplatform qws/linux-arm-g++ [/pre][pre]-thread -no-nis -no-pch -no-cups -no-stl -no-ipv6 -qt-imgfmt-jpeg -qt-libpng -qt-libjpeg -qt-libmng -embedded arm [/pre][pre]-little-endian -freetype -depths 16,24,32 -qt-gfx-linuxfb -qt-kbd-s2410kpad -qt-mouse-linuxtp [/pre][pre]-DQT_NO_QWS_KBD_S2410KPAD[/pre][pre]请注意一定要加-DQT_NO_QWS_KBD_S2410KPAD[/pre]
[/pre]
[/pre] [ 此帖被anthonymo200在2010-12-11 17:28重新编辑 ]