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

qt 运用于arm-linux平台上的按键处理

热度:104   发布时间:2016-04-25 03:43:48.0
qt 使用于arm-linux平台上的按键处理
    在arm-linux平台上使用了qt,该平台上共有8个按键,想要按键按下时,实现QPushButton的点击、按下与释放的动态效果,应怎么处理;
     qt本身提供了焦点处理机制,对于arm-linux的控件,又应该如何处理焦点,可以自己写代码预定义吗?
     
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);