【问题标题】:Qt Embedded for Linux. Keyboard layout switching用于 Linux 的 Qt 嵌入式。键盘布局切换
【发布时间】:2011-02-09 19:11:14
【问题描述】:

我正在使用 Qt Embedded 开发应用程序并在 linux 帧缓冲区中运行它。我需要一种输入非美国字符的方法。是否可以使用 Qt 更改键盘布局?

我尝试在 Qt/X11 上运行它。布局切换和输入在那里非常好。 但是当我使用 Qt/Embedded 编译它并在帧缓冲区中运行它时,我无法更改布局。

我搜索了documentation,并没有找到任何关于布局切换的信息。

我认为这与 documentation 中指定的qt 键盘驱动程序有关。 看来我应该开发自己的键盘驱动程序。但是我使用的是标准键盘,我认为必须有一种标准的方法来更改输入语言?

你有什么建议?

顺便说一句,我使用的是 4.5 版本。或许4.6有办法解决这个问题?

这里也是同样的问题:

http://lists.trolltech.com/pipermail/qt-embedded-interest/2008-August/000034.html

http://lists.trolltech.com/qt-interest/2004-02/msg00570.html

【问题讨论】:

    标签: qt internationalization keyboard-layout qtembedded


    【解决方案1】:

    4.6 版获得了keymap support。解决方案:

    1. 生成kmap文件:

      ckbcomp -layout xx > xx.kmap

    2. 将 kmap 转换为 qmap

      kmap2qmap xx.kmap xx.qmap

    3. 通过

      加载键盘映射
      1. 指定 QWS_KEYBOARD 环境变量:

        QWS_KEYBOARD="TTY:keymap=xx.qmap"

      2. 或动态加载键盘映射:

        QWSKeyboardHandler * currentKeyboardHandler =
            QKbdDriverFactory::create("TTY", "keymap=foo.qmap");
        

        确保在创建新的处理程序时删除已创建的处理程序:

        delete currentKeyboardHandler;
        currentKeyboardHandler =
            QKbdDriverFactory::create("TTY", "keymap=bar.qmap");
        

    似乎 Qt for Embedded linux 已被 Project Lighthouse 取代。不过不确定,如果它已准备好生产,我也不知道它如何处理键盘布局切换。

    更新

    Qt5 没有 QWS,所有与 QWS 相关的 API 都被移除。所以你需要一些第三方解决方案。或者为QPA写一个插件。

    【讨论】:

    • 是否也可以将新的键盘映射“添加”到已加载的驱动程序中?
    • 也许我听起来像个哑巴。 ;-)我应该在哪里执行这些命令?我的意思是我不能在 bash 中执行它们
    • @kernel-maniac 哪个命令? kmap2qmap 还是 ckbcompckbcomp 应该是你的 linux 发行版的一部分。 kmap2qmap 是 Qt 的一部分。
    • @Alex QKbdDriverFactory 是 QtGui 的一部分。所以,它是QT += QtGui
    • 3) 如果冒犯了您,我深表歉意。我的假设是基于你说你有一个编译错误,而它显然是一个链接错误。此外,这似乎是您第一次遇到此错误,而这是一个非常常见的错误。 2) 当然这是针对嵌入式 Linux 的!问题清楚地说明了这一点。再说一次,它不是编译器! 4) 如果您在桌面上使用 Qt,则不需要 qmap 文件,操作系统支持切换布局。
    【解决方案2】:

    无法评论,所以这是答案

    您需要修补 kmap2qmap(添加 AltGr_Lock 支持)、qkbd_qws.cpp(根据 AltGr_Lock 的状态更改 testmods)。

    这个简单的 qkbd_qws.cpp 补丁可以通过 CapsLock 按钮切换 beteewn 语言。

    523,526c523,524
    <             //if (d->m_locks[0] /*CapsLock*/ && (m->flags & QWSKeyboard::IsLetter))
    <             //    testmods ^= QWSKeyboard::ModShift;
    <             if (d->m_locks[0] /*CapsLock*/)
    <                 testmods ^= QWSKeyboard::ModAltGr;
    ---
    >             if (d->m_locks[0] /*CapsLock*/ && (m->flags & QWSKeyboard::IsLetter))
    >                 testmods ^= QWSKeyboard::ModShift;
    

    【讨论】:

      【解决方案3】:

      我需要一种输入非美国字符的方法

      您可以更改 qmap,但即使在 Qt 4.8.0 中也无法在美国和俄罗斯之间切换(例如)。您需要修补 kmap2qmap(添加 AltGr_Lock 支持)、qkbd_qws.cpp(根据 AltGr_Lock 的状态更改 testmods)。看起来没有人使用 QtEmbedded 和键盘。或者所有人都将最终补丁保存在秘密的地方。

      【讨论】:

        猜你喜欢
        • 2014-10-05
        • 2010-11-19
        • 2021-11-11
        • 2011-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-18
        相关资源
        最近更新 更多