`
zengxx1989
  • 浏览: 300323 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

Qt Embedded中如何实现自己的keyboard

    博客分类:
  • QT
阅读更多
最近的项目是基于Qt,既然是嵌入式设备,难免就要在根据自己的平台来实现键盘的驱动部分,当然是属于Qt一层,而不是更底层的字符设备驱动。

这里要讲的方法是在不重新编译Qt库的情况,把我们自己的键盘驱动作为一个Qt插件集成到我们的程序中。当然也可以把我们自己的键盘驱动部分直接编译到Qt库里面。

Qt中提供的插件机制(Plugin),可以使得我们很容易根据自己的硬件实现自己的键盘代码。




具体步骤:

1. 首先创建一个静态插件库(当然也可以是动态库),我们这边库名叫做optkeypad。
    a. 创建一个键盘处理类 KeypadHandler, 多继承于QObject 和 QWSKeyboardHandler, 实现一个关键的函数readKpdData(),这个函数很关键,就是用来把我们的硬件值(hardcode)转换为Qt库中定义的键值。
    b. 创建一个插件类 KeypadDriverPlugin, 继承于QKbdDriverPlugin, 这个类主要是创建一个我们自己的键盘处理类KeypadHandler,重新实现QKbdDriverPlugin的create()和keys()函数,这是两个虚函数,我们要在自己的类中重新实现这两个函数。
     c. 我们做成一个静态插件类,所以.pro文件如下。
2. 那么如何使用这个插件类呢,
    a. 在我们的应用程序中(一般在main.cpp中)添加宏 Q_IMPORT_PLUGIN(optkeypad)。optkeypad是库名,注意不包含linux中的前缀lib和扩展名.a。
    b. 在应用程序的.pro文件中添加 QTPLUGIN += optkeypad, 并且要在链接中添加这个库  LIBS += -L(路径)  -loptkeypad
    c. 接下来要为程序添加环境变量 QWS_KEYBOARD,   export QWS_KEYBOARD=OptimusKpdHandler:/dev/input/event1 (这个很重要)
        注意这个OptimusKpdHandler是怎么来的, 我们的插件类KeypadDriverPlugin要根据这个名字来建立一个键盘处理类KeypadHandler,所以如果这个名字不匹配的话,处理类是不会被创建的。
3. 接下来我们的Qt应用程序中的键值,就是KeypadHandler类的readKpdData()处理后的值。

        .pro文件


TEMPLATE = lib
CONFIG += static \
        plugin \
        release
TARGET = optkeypad
HEADERS += keypadhandler.h \
    keypaddriverplugin.h
SOURCES += keypadhandler.cpp \
    keypaddriverplugin.cpp

QMAKE_INCDIR += ../ClockCommon
QMAKE_LIBS += -lClockCommon


        keypadDriverPlugin.h文件


class KeypadDriverPlugin : public QKbdDriverPlugin
{
    Q_OBJECT
public:
    KeypadDriverPlugin(QObject *parent = 0);
    ~KeypadDriverPlugin();

    QWSKeyboardHandler *create(const QString &driver, const QString &device);
    QWSKeyboardHandler *create(const QString &driver);
    QStringList keys() const;
};


        类的实现文件


KeypadDriverPlugin::KeypadDriverPlugin(QObject *parent)
{
   
}

KeypadDriverPlugin::~KeypadDriverPlugin()
{
}

QStringList KeypadDriverPlugin::keys() const
{
    return QStringList() << "OptimusKpdHandler";
}

//
// The create() functions are responsible for returning an instance of
// the keypad driver. We do this only if the driver parameter matches our key.
//
QWSKeyboardHandler *KeypadDriverPlugin::create(const QString &driver, const QString &device)
{
    PR("KeypadDriverPlugin::create###################################: %s\n",       driver.toLocal8Bit().constData());
    if (driver.toLower() == "optimuskpdhandler")
    {
        PR("Before creating KeypadHandler\n");
        return new KeypadHandler(device);
    }

    return 0;
}

QWSKeyboardHandler *KeypadDriverPlugin::create(const QString &driver)
{
    if (driver.toLower() == "optimuskpdhandler")
    {
        PR("Before creating KeypadHandler");
        return new KeypadHandler();
    }

    return 0;
}


        keypadHandler.h文件


class KeypadHandler : public QObject, public QWSKeyboardHandler
{
    Q_OBJECT

public:
    KeypadHandler(const QString &device = QString("/dev/input/event0"));
    ~KeypadHandler();

private:
    QSocketNotifier *m_notifier;
    int kbdFd;

private slots:
    void readKpdData();
};


        类的实现文件
struct InputData
{
    unsigned int dummy1;
    unsigned int dummy2;
    unsigned short type;
    unsigned short code;
    unsigned int value;
    unsigned int dummy3;
    unsigned int dummy4;
    unsigned int dummy5;
    unsigned int dummy6;
};

KeypadHandler::KeypadHandler(const QString &device)
{
    setObjectName("Optimus Keypad Handler");
    this->kbdFd = ::open(device.toLocal8Bit().constData(), O_RDONLY, 0);

    if (kbdFd > 0)
    {
        PR("%s opened as keyboard input.\n", device.toLocal8Bit().constData());
        g_Log.Debugf(LOG_DETAIL_TRACE, 0, L"%s opened as keyboard input.", device.toLocal8Bit().constData());
        this->m_notifier = new QSocketNotifier(kbdFd, QSocketNotifier::Read, this);
        connect(this->m_notifier, SIGNAL(activated(int)), this, SLOT(readKpdData()));
    }
    else
    {
        PR("Cannot open %s for keyboard input. (%s)",
                     device.toLocal8Bit().constData(), strerror(errno));
        g_Log.Errorf(LOG_DETAIL_IMPORTANT, 0, L"Cannot open %s for keyboard input. (%s)",
                     device.toLocal8Bit().constData(), strerror(errno));
        return;
    }
}

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





// Key function
void KeypadHandler::readKpdData()
{
    InputData event;

    int n = read(kbdFd, &event, sizeof(InputData));
    if (n != sizeof(InputData))
    {
        PR("key pressed: n=%d\n", n);
        g_Log.Debugf(LOG_DETAIL_TRACE, 0, L"key pressed: n=%d", n);
        return;
    }

    PR("key pressed: type=%d, code=0x%x, value=%d, %s\n",
                 event.type, event.code, event.value, (event.value != 0)? "(Down)" : "(Up)");
    g_Log.Debugf(LOG_DETAIL_TRACE, 0, L"key pressed: type=%d, code=%d, value=%d, %s",
                 event.type, event.code, event.value, (event.value != 0)? "(Down)" : "(Up)");

    Qt::KeyboardModifiers modifiers = Qt::NoModifier;
    int unicode = 0xffff;
    int key_code = 0;

    // 可以根据自己特定的硬件值来设定。
    switch (event.code)
    {
        case 0x2:
            key_code = Qt::Key_1;
            unicode = '1';
            break;
        case 0x110:
            key_code = Qt::Key_Context1;
            unicode = 0xffff;
            break;
        case 0x100:
            key_code = Qt::Key_Back;
            unicode = 0xffff;
            break;
        default:

            break;
    }

    this->processKeyEvent(unicode, key_code, modifiers, event.value != 0, false);
}
分享到:
评论

相关推荐

    Qt Embedded中如何实现自己的keyboard.doc

    本文将详细介绍如何在Qt Embedded环境中实现自己的键盘驱动,并将其作为Qt插件集成到项目中。 #### 二、实现原理与步骤 ##### 1. 创建键盘驱动插件 为了实现在不重新编译Qt库的情况下集成自定义键盘驱动的目标,...

    QtEmbedded

    通过深入学习这个教程,开发者不仅可以掌握QtEmbedded的基本用法,还能了解如何在实际项目中应用这些知识,构建高质量的嵌入式应用。对于想要涉足嵌入式GUI开发的工程师来说,这是一份非常有价值的参考资料。

    QtEmbedded-4.8.5-arm.zip

    《QtEmbedded-4.8.5-arm.zip:深入探索Ubuntu下的Qt ARM编译环境》 在软件开发领域,Qt是一个广泛使用的跨平台应用程序框架,它允许开发者构建功能丰富的图形用户界面,支持多种操作系统,包括Linux、Windows、Mac ...

    QtEmbedded实例教程

    **QtEmbedded实例教程** QtEmbedded,也称为Qt for Embedded Linux,是Qt库的一个版本,专为嵌入式设备设计和优化。它允许开发者在各种操作系统上构建用户界面,特别是那些资源有限的Linux系统。本教程将带你深入...

    qt embedded 软键盘输入的实现

    本文将详细介绍如何在Qt Embedded环境中实现软键盘输入功能,以供字母、数字及各种符号的输入。 首先,我们要了解Qt中的Input Method Framework(输入法框架)。这是Qt提供的一种机制,允许应用程序接收和处理用户...

    qt embedded 软键盘输入的实现 - 无乱码

    本文将深入探讨如何在Qt Embedded环境中实现软键盘输入,并解决可能出现的乱码问题。 标题提到的"qt embedded 软键盘输入的实现 - 无乱码"是针对嵌入式设备设计的一种解决方案,确保用户能够通过软件模拟的键盘进行...

    qt embedded 安装

    通过上述步骤,你应该能够成功地在自己的系统上安装Qt Embedded。这不仅为嵌入式系统的GUI开发打下了坚实的基础,也为进一步探索和利用Qt的高级特性开启了大门。希望本文能帮助你在Qt Embedded的学习和应用道路上...

    qt-embedded-2.3.8.tar.gz_QT/Embedded_qt embedded_qt-embedded_qt2

    这个旧版本的Qt Embedded对于研究历史代码、学习Qt框架的实现原理或者维护老项目来说非常有价值。然而,由于Qt已经发展到更现代的版本,例如Qt 5和Qt 6,这些新版本提供了更多的功能、更好的性能和更多的API支持。...

    QtEmbedded开发环境建立的过程

    在实际开发过程中,开发者还需要了解Qt的类库和API,学习如何使用Qt Creator或QMake来创建项目文件,以及如何编写Qt/Embedded应用程序的代码。此外,对设备驱动、硬件平台的了解也是必不可少的,因为Qt/Embedded通常...

    qt embedded

    在本文中,我们将深入探讨QT Embedded的核心特性、优势、使用场景以及如何进行开发。 1. **核心特性** - **轻量级**:QT Embedded针对资源有限的嵌入式系统进行了优化,可以运行在低内存和CPU能力的硬件上。 - **...

    Qt embedded

    在 qtopia/src/qt/qconfig-qpe.h 文件中,可以配置 Qt Embedded 的各种参数,例如显示深度、字体、语言等。然后,可以使用 Qt Embedded 开发各种嵌入式应用程序,例如图形用户界面、游戏、多媒体应用程序等。 四、...

    qt-embedded-free-3.3.6.tar.gz_Free!_qt embedded_qt embedded free

    QT Embedded,也称为Qt for Embedded Linux,是Qt框架的一个分支,专为嵌入式设备设计,...同时,考虑到这是一个开源项目,开发者可以参与到社区中,获取帮助、报告问题或贡献自己的代码,共同推动Qt Embedded的发展。

    QtEmbedded在嵌入式Linux系统中的应用共8页

    【标题】"QtEmbedded在嵌入式Linux系统中的应用共8页" 提示我们这篇文档主要探讨了QtEmbedded(现在通常称为Qt for Embedded Linux)在嵌入式操作系统上的使用,特别是集中在Linux环境下。QtEmbedded是Qt框架的一个...

    Qt-Embedded-5.7.0.tar.xz

    1. **信号与槽(Signals & Slots)**:这是Qt中的一种通信机制,允许对象之间相互通信,无需了解彼此的具体实现。当一个对象的某个状态改变时(例如按钮被点击),会发出一个信号,其他对象可以连接这个信号并执行...

    qt-embedded-2.3.4

    在Qt Embedded 2.3.4版本中,开发者可以期待以下关键特性: 1. **轻量级和高效**:此版本的Qt Embedded优化了内存和CPU使用,使其能够在资源受限的硬件上运行,同时保持高性能和响应速度。 2. **跨平台兼容性**:...

    QtEmbedded_安装

    **QtEmbedded 安装指南** ...在这个过程中,文档《QtEmbedded_安装.doc》应提供更详细、针对特定环境的指导,包括解决可能出现的问题和调试技巧,它是安装过程中的重要参考。请仔细阅读并按照其指示进行操作。

    基于Qt/Embedded的嵌入式控制界面开发

    在嵌入式系统开发中,基于Qt/Embedded的控制界面设计是实现高效、直观的人机交互的关键技术。Qt/Embedded是Qt库的一个分支,专为嵌入式设备设计,允许开发者构建高质量的图形用户界面(GUI)应用。由于其开源(遵循...

Global site tag (gtag.js) - Google Analytics