当前位置: 代码迷 >> QT开发 >> qt 使用来arm-linux平台上的按键处理
  详细解决方案

qt 使用来arm-linux平台上的按键处理

热度:315   发布时间:2016-04-25 02:58:45.0
qt 使用于arm-linux平台上的按键处理
    在arm-linux平台上使用了qt,该平台上共有8个按键,想要按键按下时,实现QPushButton的点击、按下与释放的动态效果,应怎么处理;
     qt本身提供了焦点处理机制,对于arm-linux的控件,又应该如何处理焦点,可以自己写代码预定义吗?
     
------解决思路----------------------
qevent 写事件处理吧,然后事件写成模拟按键,比如你让主界面获得焦点,然后在主界面下就可以用qevent.h 写检测键盘事件 检查到F1后,发出信号F1(),再把信号连接到相应的槽函数.比如你想发送按键的话用QApplication::sendEvent(...) 希望对你有帮助 
------解决思路----------------------
如果你的按键驱动已经OK的话,实际上你需要做的仅仅是把驱动读到的键值发送给Qt。
可以用QSocketNotifier 来监听你的按键驱动文件的改动,然后需要自己写一个类继承QKeypadHandler【如果没记错的话】,在键值处理的地方Open你的驱动文件,读取键值并包装成Qt的事件【或者按键事件,比如Enter,Esc等等】,最后通过QKeypadHandler的一个方法直接把按键发送到Qt的事件循环中去,任务就算是完成了。
需要注意的是:最好放到一个单独的线程里面来做这些事情,以免主界面卡顿影响心情。
------解决思路----------------------
贴一个例子
#ifndef KEYPADHANDLER_H
#define KEYPADHANDLER_H

//#include "keypad_global.h"
#include <QObject>
#include <QtGui/QWSKeyboardHandler>
#include <QSocketNotifier>

class KeypadHandler : public QObject, public QWSKeyboardHandler
{
    Q_OBJECT
public:
    KeypadHandler(const QString &device = QString("/dev/buttons"), QObject *parent = 0);
    ~KeypadHandler();

private slots:
    void kbdReadyRead();
private:
    int kbdFd;
    QSocketNotifier *notifier;
};
#endif // KEYPADHANDLER_H

#include "keypadhandler.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <QDebug>
#include <QString>

KeypadHandler::KeypadHandler(const QString &device, QObject *parent)
    : QObject(parent), QWSKeyboardHandler()
{
    setObjectName("Keypad Handler");
    this->kbdFd = ::open(device.toAscii().constData(), O_RDONLY);
    if(this->kbdFd < 0)
        return;

    this->notifier = new QSocketNotifier(this->kbdFd, QSocketNotifier::Read, this);
    connect(this->notifier, SIGNAL(activated(int)), this, SLOT(kbdReadyRead()));
}


KeypadHandler::~KeypadHandler()
{
    if (this->kbdFd >= 0)
        ::close(this->kbdFd);
}

void KeypadHandler::kbdReadyRead()
{
    char key = '0';

    char buttons[20] = {'0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0','0', '0', '0', '0', '0', '0','0', '0'};
    int count_of_changed_key;
    int i;
    char current_buttons[20];


    if (read(this->kbdFd, current_buttons, sizeof(current_buttons)) != sizeof(current_buttons))
    {
        qDebug() << "keypad read error";
        return ;
    }

    for (i = 0, count_of_changed_key = 0; i < sizeof(buttons) / sizeof(buttons[0]); i++)
    {
        if (buttons[i] != current_buttons[i])
        {
            buttons[i] = current_buttons[i];
            count_of_changed_key++;
            key = current_buttons[i];
        }
    }

    Qt::KeyboardModifiers modifiers = Qt::NoModifier;
    int unicode = 0x0000;
    int keycode = 0;

    QString keyCode;
    keyCode.setNum(key, 16);

    switch (key)
    {
    case 0x81:
        keycode = Qt::Key_Up;
        unicode = 'U';
        qDebug() << "Key Up = " << "key code : " << keyCode;
        break;

    case 0x82:
        keycode = Qt::Key_Down;
        unicode = 'D';
        qDebug() << "Key Down = " << "key code : " << keyCode;
        break;
    case 0x83:
        keycode = Qt::Key_Left;
        unicode = 'L';
        qDebug() << "Key Left = " << "key code : " << keyCode;
        break;
    case 0x84:
        keycode = Qt::Key_Right;
        unicode = 'R';
        qDebug() << "Key Right = " << "key code : " << keyCode;
        break;
    case 0x85:
        keycode = Qt::Key_Escape;
        unicode = 'E';
        qDebug() << "Key Escape = " << "key code : " << keyCode;
        break;

    default:
        qDebug() << "Unkown Key! The key code is: " << keyCode;
        return;
    }
    this->processKeyEvent(unicode, keycode, modifiers, true, false);
}