2806|0

11

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

关于qte3.3.8键盘问题,请高手指教? [复制链接]

关于qte3.3.8键盘问题,请高手指教?

最近在2410上移植qte3.3.8,交叉编译后把相关库下到开发板上,程序可以运行了,但是键盘没有反映,我板子上原来用的是qte2.3.7版本,键盘都可以正常使用,
不知道为什么换成qte3.3.8之后就没有反映了,下面是我在网上找到的加入自定义键盘的方法,有不太明白的地方,请哪位大哥帮忙看一下,小弟先谢过了!
下面是自定义键盘接口:需要改动的地方有4个,在qt-arm/src/embedded 目录下
1.增加一个mykbd_qws.h,内容如下:
#ifndef MYKBD_QWS_H
#define MYKBD_QWS_H

#include "qkbd_qws.h"  //QT定义抽象基类QWSKeyboardHandler


#ifndef QT_NO_MYKBD   //编译时可以通过定义这个变量从而不编译这个模块

class MyKbdPrivate;   //我们的键盘设备私有类,实现具体的键盘设备操作,如打开键盘、读键盘数据,解析按键等等。


class MyKbdHandler : public QWSKeyboardHandler //供系统调用的键盘句柄
{
public:
    MyKbdHandler(const QString&);
    virtual ~MyKbdHandler();
private:
    MyKbdPrivate *d;
};

#endif // QT_NO_MYKBD
#endif // MYKBD_QWS_H

2.增加一个mykbd_qws.cpp,内容如下:
#include "mykbd_qws.h"
#ifndef QT_NO_MYKBD
#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 MyKbdPrivate : public QObject
{
    Q_OBJECT
public:
    MyKbdPrivate( MyKbdHandler *h, const QString& );
    virtual ~MyKbdPrivate();

    bool isOpen() { return buttonFD > 0; }

private slots:
    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;
}
void MyKbdPrivate::readKeyboardData()
{
int n = 0;
int idx = 0;
    n  = read(buttonFD, &kbdBuffer, sizeof(kbdBuffer));
    if(n!=1)
    return;
    int keycode = Qt::Key_unknown;

    switch ( (kbdBuffer) & 0xff ) {
        case 1:
        keycode = Qt::Key_Left;
        break;

        case 2:
        keycode = Qt::Key_Right;
        break;

        case 3:
        keycode = Qt::Key_Tab;
        break;

        case 4:
        keycode = Qt::Key_Backtab;
        break;

        case 5:
        keycode = Qt::Key_Enter;
        break;

    case 6:
        keycode = Qt::Key_Return;

        break;

        default:
qDebug("Unrecognised key code %d", kbdBuffer );
    }

        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


    kbdBuffer的大小和switch()语句大家可以根据自己的驱动程序作调整
注意:n=read(buttonFD, &kbdBuffer, sizeof(kbdBuffer));这里我的kbdBuffer是一个char型,这里的read每次读回一个char型,所以我的驱动程序里read函数也要每次返回一个char字符,6个按键返回的值分别是1,2,3,4,5,6,对应的键为:Qt::Key_Left, Qt::Key_Right, Qt::Key_Tab, Qt::Key_Backtab, Qt::Key_Enter, Qt::Key_Return。


3.修改qkbddriverfactory_qws.cpp中的QWSKeyboardHandler *QKbdDriverFactory::create(),添加自己的定义的接口
其中qkbddriverfactory_qws.cpp如下:注有//mykeyboard 表示是我添加的语句

QWSKeyboardHandler *QKbdDriverFactory::create( const QString& key, const QString& device )
{
    QString driver = key.lower();

#ifndef QT_NO_MYKBD   //mykeyboard          
      if ( driver == "mykbd" || driver.isEmpty() )
            return new MyKbdHandler( device );
#endif


#ifdef Q_OS_QNX6
    if ( driver == "qnx" || driver.isEmpty() )
    return new QWSQnxKeyboardHandler( device );
#endif
      ...

    return 0;
}


QStringList QKbdDriverFactory::keys()
{
    QStringList list;

#ifdef Q_OS_QNX6
    if ( !list.contains( "Qnx" ) )
    list << "Qnx";
#endif
#ifndef QT_NO_MYKBD    //mykeyboard
    if ( !list.contains( "MYKBD" ) )
    list << "MYKBD";
#endif
#ifndef QT_NO_QWS_KBD_SL5000
    if ( !list.contains( "SL5000" ) )
    list << "SL5000";
#endif
     ...

#endif
..........................................

4.最后就是修改qt_embedded.pri使得QT/Embedded在编译时会加上你自己定义的接口实现
#
# Keyboard drivers
#

    ...

    contains( kbd-drivers, vr41xx ) {
        HEADERS +=$$EMBEDDED_H/qkbdvr41xx_qws.h
        SOURCES +=$$EMBEDDED_CPP/qkbdvr41xx_qws.cpp
    }
    else:DEFINES += QT_NO_QWS_KBD_VR41

    contains( kbd-drivers, mykbd ) {
        HEADERS +=$$EMBEDDED_H/mykbd_qws.h
        SOURCES +=$$EMBEDDED_CPP/mykbd_qws.cpp
    }
    else:DEFINES += QT_NO_QWS_KBD_MYKBD

这样编译之后,运行是要设置环境变量export QWS_KEYBOARD=MKBD:/dev/mykeyboard
不明白的地方就是/dev/mykeyboard这个是编译之后生成的吗?
还是要手动添加上去的,怎么添加?请哪位大哥帮小弟解决一下,谢谢!

点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表