标题:一个很老的问题,到现在还是没有一个完整的答案:QT/E中怎样响应开发板的按键事件?
作者:傻瓜
日期:2006-10-19 00:33
内容:
驱动程序写好了,放在/dev/buttons上
我在qte2.3.7/src/kernel/qkeyboard_qws.cpp文件里直接改成使用QWSVr41xxButtonsHandler类:在
QWSKeyboardHandler *QWSServer::newKeyboardHandler( const QString &spec )
{
QWSKeyboardHandler *handler = 0;
handler = new QWSVr41xxButtonsHandler();
return handler;
}
应用程序里的按键处理函数只是简单得改变了QLabel的值
void MyMainWindow::keyPressEvent(QKeyEvent*k)
{
label -> setText("Change");
}
在qt2.3.2能够成功响应键盘上的按键,但在开发板上却没有响应
网上流传的在
QWSKeyboardHandler *QWSServer::newKeyboardHandler( const QString &spec )
中添加自己的按键处理函数。
具体到底是怎样做的,有没有高手能够指点一下?
#1 [shiroki 10-19 13:34]
你可以从一个现有的handler类来改改, 也可以自己派生一个handler类。
主要需要重写 readKeyboardData函数, 这个函数会调用driver提供的方法读取键盘的事件。 比如会调用read读取一个键盘事件的结构, 从这个结构里可以得到物理keycode值, 你必须在readKeyboardData函数里做好从物理keycode向qt里定义的keycode的转换, 这样qt才能正确处理键值
剩下的看个例子应该就明白了
#2 [傻瓜 10-20 19:31]
例子呢?
#3 [傻瓜 10-20 19:43]
/*********************************/
/*QWSVr41xxButtonsHandler类的构造函数*/
/*********************************/
QWSVr41xxButtonsHandler::QWSVr41xxButtonsHandler() : QWSKeyboardHandler()
terminalName = "/dev/buttons";
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 ;
kbdIdx = 0;
}
/********************************************/
/*QWSVr41xxButtonsHandler类的readKeyboardData函数*/
/********************************************/
void QWSVr41xxButtonsHandler::readKeyboardData()
{
int n = 0;
do {
n= read(buttonFD, kbdBuffer+kbdIdx, kbdBufferLen - kbdIdx );
if ( n > 0 )
kbdIdx += n;
} while ( n > 0 );
int idx = 0;
while ( kbdIdx - idx >= 2 ) {
unsigned char *next = kbdBuffer + idx;
unsigned short *code = (unsigned short *)next;
int keycode = Qt::Key_unknown;
switch ( (*code) & 0x0fff ) {
case 0x7:
keycode = Qt::Key_Up;
break;
case 0x9:
keycode = Qt::Key_Right;
break;
case 0x8:
keycode = Qt::Key_Down;
break;
case 0xa:
keycode = Qt::Key_Left;
break;
case 0x3:
  ..
#4 [shiroki 10-22 21:08]
先看看你的这个handler装载上了没有。 这里不是也可以加信息吗, 能打出来吗? qdebug的话不太保险, 用qwarning最好
#5 [傻瓜 10-25 12:40]
试过了,没有用。 handler 好象没有装载上。那应该怎么办?
是不是在主函数中声明一个QWSServer对象或者直接调用QWSServer::newKeyboardHandler()函数?不过好象也不行
我的QQ是9339855 要不要来探讨一下?