• 6440阅读
  • 2回复

QT是如何处理按键输入的?? [复制链接]

上一主题 下一主题
离线anthonymo200
 
只看楼主 倒序阅读 楼主  发表于: 2010-12-11
最近开发一个小项目用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重新编辑 ]
描述:相关文件
附件: qkbddriverfactory_qws.cpp (6 K) 下载次数:4
描述:相关文件
附件: qkbds2410kpad_qws.cpp (3 K) 下载次数:4
描述:相关文件
附件: qkbds2410kpad_qws.h (1 K) 下载次数:4
离线anthonymo200
只看该作者 1楼 发表于: 2010-12-11
第3步:把编译好的库放到ramdisk里面, 烧写到FLASH中。  
第3步:加载键盘的驱动程序, 加载成功后, 设备名为/dev/keybutton
第5步:配置QT变量, 首先连接一个设备名 ln -s /dev/keybutton  /dev/s2410kpad
export QWS_KEYBOARD=S2410KPAD:/dev/s2410kpad
第6步:使用./Qtapp -qws 运行 Qt应用程序, 但是QT应用程序这边没有任何变化。  

有请各位大虾给点建议。 也说说你们的方法。  谢谢!
离线liyi520181
只看该作者 2楼 发表于: 2011-10-09
很好,谢谢了
快速回复
限100 字节
 
上一个 下一个