• 6466阅读
  • 8回复

一个很老的问题,到现在还是没有一个完整的答案:QT/E中怎样响应开发板的按键事件? [复制链接]

上一主题 下一主题
离线傻瓜
 
只看楼主 倒序阅读 楼主  发表于: 2006-10-19
驱动程序写好了,放在/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 )
中添加自己的按键处理函数。
具体到底是怎样做的,有没有高手能够指点一下?
[ 此贴被XChinux在2006-10-21 09:29重新编辑 ]
离线shiroki

只看该作者 1楼 发表于: 2006-10-19
你可以从一个现有的handler类来改改, 也可以自己派生一个handler类。
主要需要重写 readKeyboardData函数, 这个函数会调用driver提供的方法读取键盘的事件。 比如会调用read读取一个键盘事件的结构, 从这个结构里可以得到物理keycode值, 你必须在readKeyboardData函数里做好从物理keycode向qt里定义的keycode的转换, 这样qt才能正确处理键值

剩下的看个例子应该就明白了
--
shiro is White
ki is tree
http://www.cuteqt.com
论坛 http://www.cuteqt.com/bbs
博客 http://www.cuteqt.com/blog
博客镜像: http://sites.cuteqt.com/cuteqt
Linux/Qt/嵌入式讨论群 http://qun.qq.com/air/5699823
离线傻瓜
只看该作者 2楼 发表于: 2006-10-20
例子呢?
离线傻瓜
只看该作者 3楼 发表于: 2006-10-20
/*********************************/
/*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 [kbdBufferLen];
  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:
       keycode = Qt::Key_Up;
       break;
      case 0x4:
       keycode = Qt::Key_Down;
       break;
      case 0x1:
       keycode = Qt::Key_Return;
       break;
      case 0x2:
       keycode = Qt::Key_F4;
       break;
      default:
       qDebug("Unrecognised key sequence %d", (int)code );
   }
   if ( (*code) & 0x8000 )
      processKeyEvent( 0, keycode, 0, FALSE, FALSE );
   else
      processKeyEvent( 0, keycode, 0, TRUE, FALSE );
   idx += 2;
  }

  int surplus = kbdIdx - idx;
  for ( int i = 0; i < surplus; i++ )
   kbdBuffer = kbdBuffer[idx+i];
  kbdIdx = surplus;
}

从理论上说,我的按键驱动程序只要放在"/dev/buttons"就可以响应了,但我在构造函数中加上了一些调试信息,当我按按键时却没有信息在终端打印出来
离线shiroki

只看该作者 4楼 发表于: 2006-10-22
先看看你的这个handler装载上了没有。 这里不是也可以加信息吗, 能打出来吗? qdebug的话不太保险, 用qwarning最好
--
shiro is White
ki is tree
http://www.cuteqt.com
论坛 http://www.cuteqt.com/bbs
博客 http://www.cuteqt.com/blog
博客镜像: http://sites.cuteqt.com/cuteqt
Linux/Qt/嵌入式讨论群 http://qun.qq.com/air/5699823
离线傻瓜
只看该作者 5楼 发表于: 2006-10-25
试过了,没有用。 handler 好象没有装载上。那应该怎么办?
是不是在主函数中声明一个QWSServer对象或者直接调用QWSServer::newKeyboardHandler()函数?不过好象也不行

我的QQ是9339855 要不要来探讨一下?
离线shiroki

只看该作者 6楼 发表于: 2006-10-29
2.3.7我不熟, 估计得靠你看code了
我记得qte里是可以用环境变量来控制装载哪个kbhandler的, 你到code里搜搜。
--
shiro is White
ki is tree
http://www.cuteqt.com
论坛 http://www.cuteqt.com/bbs
博客 http://www.cuteqt.com/blog
博客镜像: http://sites.cuteqt.com/cuteqt
Linux/Qt/嵌入式讨论群 http://qun.qq.com/air/5699823
离线diaryon

只看该作者 7楼 发表于: 2006-10-31
编辑qkeyboard_qws.cpp后,如何将其加载到QTE程序中呢?希望高手指点。
离线shiroki

只看该作者 8楼 发表于: 2006-10-31
这个文件是qte库的一部分, 重新编译libqte即可
--
shiro is White
ki is tree
http://www.cuteqt.com
论坛 http://www.cuteqt.com/bbs
博客 http://www.cuteqt.com/blog
博客镜像: http://sites.cuteqt.com/cuteqt
Linux/Qt/嵌入式讨论群 http://qun.qq.com/air/5699823
快速回复
限100 字节
 
上一个 下一个