求助!!!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
同时机器黑屏,好像系统死掉了。
标准按键,直接使用keyPressEventy 就可以了 TQ-lkp 发表于 2013-2-28 18:25 static/image/common/back.gif
标准按键,直接使用keyPressEventy 就可以了
不是标准按键,我是想把板子上那几个键映射到几个标准键上,这样才可以使用keyPressEventy ,但是现在一按键就出现那问题,不知道是哪里出错了? nice026 发表于 2013-3-1 08:44 static/image/common/back.gif
不是标准按键,我是想把板子上那几个键映射到几个标准键上,这样才可以使用keyPressEventy ,但是现在一按 ...
最好的方法是修改驱动,将按键注册成输入子系统
页:
[1]