nice026 发表于 2013-2-28 17:33:00

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

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 static/image/common/back.gif
标准按键,直接使用keyPressEventy 就可以了

不是标准按键,我是想把板子上那几个键映射到几个标准键上,这样才可以使用keyPressEventy ,但是现在一按键就出现那问题,不知道是哪里出错了?

TQ-lkp 发表于 2013-3-1 10:04:37

nice026 发表于 2013-3-1 08:44 static/image/common/back.gif
不是标准按键,我是想把板子上那几个键映射到几个标准键上,这样才可以使用keyPressEventy ,但是现在一按 ...

最好的方法是修改驱动,将按键注册成输入子系统
页: [1]
查看完整版本: 求助!!!Qt按键事件出错