• 5317阅读
  • 3回复

qte自定义键盘问题 [复制链接]

上一主题 下一主题
离线rooney
 
只看楼主 倒序阅读 楼主  发表于: 2009-07-09

QT自定义键盘问题,我在qkeyboard_qws.cpp里继承了QWSKeyboardHandler,实现自己定义的键盘,当按键的时候没有进入readKeyboardData()这个函数,是不是驱动方面还有问题?谢谢啦!

QWSEbookButtonsHandler::QWSEbookButtonsHandler() : 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());
        return;
    }
    printf("open buttons dev ok\n");
  
    notifier = new QSocketNotifier( buttonFD, QSocketNotifier::Read, this );
    connect( notifier, SIGNAL(activated(int)),this,SLOT(readKeyboardData()));
  
}

QWSEbookButtonsHandler::~QWSEbookButtonsHandler()
{
    if ( buttonFD > 0 ) {
        ::close( buttonFD );
        buttonFD = -1;
    }
    delete notifier;
    notifier = 0;
    delete [] kbdBuffer;
}
void QWSEbookButtonsHandler::readKeyboardData()
{
    int n=0 ;
    int key_value;
    int buf[81];    
    n  = ::read(buttonFD, &key_value, sizeof key_value);    
    if (n != sizeof key_value) return;
    printf("key value is %d  by xingfeng\n",key_value);
    doKey(key_value);  
}
void QWSEbookButtonsHandler::doKey(int key)
{
    int k=(-1);
    switch(key){        
    case 1:
        k=Qt::Key_W;
        break;
    case 2:
        k=Qt::Key_S;
        break;
    case 3:
        k=Qt::Key_A;
        break;
    case 4:
        k=Qt::Key_D;
        break;
    case 5:
        k=Qt::Key_L;
        break;
    case 6:
        k=Qt::Key_Escape;
        break;
    default: k=(-1);
        break;
    }

    if( k >= 0 )  
    {
        qwsServer->processKeyEvent( 0, k, 0, 1, false );
    }
}

newKeyboardHandler里有生成自定义的对象了

else if( type == "/dev/buttons")
    {
        handler = new QWSEbookButtonsHandler();    
        printf("use  sanxo keypad \n");    
    }

启动qt程序也有打印
open buttons dev ok
use  sanxo keypad
notifier = new QSocketNotifier( buttonFD, QSocketNotifier::Read, this );
    connect( notifier, SIGNAL(activated(int)),this,SLOT(readKeyboardData()));
也就是说这里没有触发信号
离线shiroki

只看该作者 1楼 发表于: 2009-07-09
刚在某个版里回过一次了,拜托别发那么多版成么。。
--
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
离线shiroki

只看该作者 2楼 发表于: 2009-07-10
奇怪,找不到我回复过的帖子了。。 再说一次吧。一个可能性是键盘的设备名字不对,还一种可能是键盘的驱动没有实现poll方法,这个是socketnotifier要用到的。
--
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
离线zhenfeng
只看该作者 3楼 发表于: 2009-12-11
引用第2楼shiroki于2009-07-10 13:41发表的  :
奇怪,找不到我回复过的帖子了。。 再说一次吧。一个可能性是键盘的设备名字不对,还一种可能是键盘的驱动没有实现poll方法,这个是socketnotifier要用到的。


我跟上面楼主的实现代码一样;而且可以确定键盘设备名称没有错,已经正确打开;同时键盘驱动也实现了poll方法(自己反复检查觉得也没什么问题);但是还是没有响应。还可能是什么原因导致错误?
快速回复
限100 字节
 
上一个 下一个