天嵌 ARM开发社区

 找回密码
 注册
查看: 2993|回复: 3

求助!!!Qt按键事件出错

[复制链接]
nice026 发表于 2013-2-28 17:33:00 | 显示全部楼层 |阅读模式
TQ2440--
部分代码如下:

hardinit.h
……
#include <QObject>
#include <QWSKeyboardHandler>
……
class MyKeyHandler :public QObject, public QWSKeyboardHandler
{
    Q_OBJECT
public:
    MyKeyHandler(){
    };
    virtual ~MyKeyHandler();
public:
    void readKeyData(int);
};
hardinit.cpp
#include "hardinit.h"
……
MyKeyHandler *keyhandlder =0;
int systeminit(void)
{
    ……   
    struct sigaction kbact;
    kbact.sa_handler = key_event;
    kbact.sa_flags = 0;
    sigemptyset(&kbact.sa_mask);
    //键盘初始化
     KeyFd = open("/dev/kb",O_RDONLY); //板子上实际按键
     if(KeyFd == -1){
            perror("Failed to open /dev/kb!\n");
            close(KeyFd);
            exit(1);
     }
     MyPid =  getpid();
     ioctl(KeyFd,ON,MyPid);//传递pid给设备驱动,否则不送回键码
     ……
}
static void key_event(int sig){
    int tmp_keyvalue;
    read(KeyFd,&tmp_keyvalue,1);
    tmp_keyvalue = 0xff&tmp_keyvalue;
    keyhandlder->readKeyData(tmp_keyvalue);
}
void MyKeyHandler::readKeyData(int receive_key)
{
   
    static int newkey;
    Qt::KeyboardModifiers modifiers =Qt::NoModifier;
    int unicode =0xffff;
    int key_code =0;
   
   
    if(newkey !=receive_key)
    {
        newkey =receive_key;
        switch (newkey)
       {
        
        case 0xfd:
            key_code =Qt::Key_Back; //BackKey
            unicode =0xffff;
            break;
        case 0xfe:
            key_code =Qt::Key_Enter; //OKKey
            unicode =0xffff;
            std::cout<<"click the Ok Key !!"<<std::endl;
            break;
      
        case 0xfb:
            key_code =Qt::Key_Down; //DownKey
            unicode =0xffff;
            std::cout<<"click the Down Key !!"<<std::endl;
            break;
        
        case 0x7f:
            key_code =Qt::Key_Home; //OptionKey
            unicode =0xffff;
            break;
      
        case 0x7d:
            key_code =Qt::Key_Up; //UpKey
            unicode =0xffff;
            break;
      
        default:
            break;
       }
    }
    std::cout<<" received-keyvalue="<<std::hex<<newkey<<std::endl;
   
    processKeyEvent(unicode,key_code,(Qt::KeyboardModifiers)modifiers,newkey!=0,false);
    return;
}

keyprocess.cpp
void layout1::keyPressEvent(QKeyEvent *event)
{
    std::cout<<"receive the keyEvent!"<<std::endl;
    switch(event->key()){
    case Qt::Key_Up:
        keyCode =UpKey;
        selectMenu(keyCode);
        break;
    case Qt::Key_Down:
        keyCode =DownKey;
        selectMenu(keyCode);
        break;
    case Qt::Key_Enter:
        keyCode =OkKey;
        selectMenu(keyCode);
        break;
    case Qt::Key_Back:
        keyCode =BackKey;
        selectMenu(keyCode);
        break;
    default:
        break;
    }
}


----------
按键后串口打印信息:
click the Down Key !!
received-read-keyvalue=fb
Uninitialised timer!
This is just a warning.  Your computer is OK
function=0x00000000, data=0x0


同时机器黑屏,好像系统死掉了。







TQ-lkp 发表于 2013-2-28 18:25:47 | 显示全部楼层
标准按键,直接使用keyPressEventy 就可以了
 楼主| nice026 发表于 2013-3-1 08:44:46 | 显示全部楼层
TQ-lkp 发表于 2013-2-28 18:25
标准按键,直接使用keyPressEventy 就可以了

不是标准按键,我是想把板子上那几个键映射到几个标准键上,这样才可以使用keyPressEventy ,但是现在一按键就出现那问题,不知道是哪里出错了?
TQ-lkp 发表于 2013-3-1 10:04:37 | 显示全部楼层
nice026 发表于 2013-3-1 08:44
不是标准按键,我是想把板子上那几个键映射到几个标准键上,这样才可以使用keyPressEventy ,但是现在一按 ...

最好的方法是修改驱动,将按键注册成输入子系统
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-14 08:33 , Processed in 1.046875 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表