Linux下的Qt嵌入式系统。键盘布局切换。

4
我正在使用Qt Embedded开发应用程序,并在Linux framebuffer上运行。我需要一种输入非美式字符的方法。是否可以使用Qt更改键盘布局?
我尝试在Qt / X11上运行它。布局切换和输入在那里完全正常。 但是,当我使用Qt / Embedded编译它并在framebuffer中运行时,我无法更改布局。
我在文档中搜索,没有找到有关布局切换的任何信息。
我认为这与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

3个回答

7

版本4.6增加了按键映射支持。解决方案:

  1. generate kmap file:

    ckbcomp -layout xx > xx.kmap

  2. convert kmap to qmap

    kmap2qmap xx.kmap xx.qmap

  3. load keymap either by

    1. specifying QWS_KEYBOARD environment variable:

      QWS_KEYBOARD="TTY:keymap=xx.qmap"

    2. or loading a keymap dynamically:

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

      Make sure that you delete created handler when you create a new one:

      delete currentKeyboardHandler;
      currentKeyboardHandler =
          QKbdDriverFactory::create("TTY", "keymap=bar.qmap");
      
似乎Qt嵌入式Linux被项目灯塔取代。不确定它是否已准备好用于生产,也不知道它如何处理键盘布局切换。

更新

Qt5没有QWS,所有与QWS相关的API都已删除。因此,您需要一些第三方解决方案或为 QPA编写插件。


1
也许我会听起来很蠢。;-) 我应该在哪里执行这些命令?我的意思是我不能在bash中执行它们。 - manmatha.roy
1
@kernel-maniac 哪个命令?kmap2qmap还是ckbcompckbcomp应该是您的Linux发行版的一部分。kmap2qmap是Qt的一部分。 - Vanuan
1
@Alex QKbdDriverFactory是QtGui的一部分。因此,它的QT += QtGui - Vanuan
1
  1. 如果我冒犯了您,我向您道歉。我的假设是基于您说您有编译错误,而实际上它显然是链接错误。此外,看起来这是您第一次遇到这个错误,而这是一个非常常见的错误。
  2. 当然,这是针对嵌入式Linux的!问题清楚地说明了这一点。再次强调,这不是编译器!
  3. 如果您在桌面上使用Qt,则不需要qmap文件,因为操作系统支持切换布局。
- Vanuan
不,shell 说 "/bin/sh: loadkeys: not found",但我不介意使用 kmap 或 qmap 或者从这些文件类型中自动生成的 QMap<>。 - Alex
显示剩余18条评论

3

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

您可以更改qmap,但即使在Qt 4.8.0中也没有办法在美国和俄罗斯(例如)之间切换。您需要修补kmap2qmap(添加AltGr_Lock支持),qkbd_qws.cpp(根据AltGr_Lock的状态更改testmods)。似乎没有人使用带键盘的Qt嵌入式系统,或者所有人将最终补丁保存在秘密位置。


0

无法评论,因此这是答案:

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

这个简单的qbkd_qws.cpp补丁使得可以通过CapsLock按钮在不同语言之间切换。

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接