Question

I'm developing application with Qt Embedded and run it in linux framebuffer. I need a way to type non-US characters. Is it possible to change keyboard layout with Qt?

I tried to run it on Qt/X11. Layout switching and input are perfectly fine there. But when I compile it with Qt/Embedded and run it in framebuffer I cannot change layout.

I searched in the documentation and didn't find anything about layout switching.

I think it has something to do with qt keyboard driver as specified at the documentation. It seems that I should develop my own keyboard driver. But I'm using standard keyboard and I think there must be a standard way to change input language?

What would you suggest?

BTW, I'm using 4.5 version. Maybe 4.6 has something to solve this issue?

Exact the same problem here:

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

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

Was it helpful?

Solution

Version 4.6 has gained keymap support. Solution:

  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");
      

Seems like Qt for Embedded linux is superseeded by Project Lighthouse. Not sure though, if it is production ready, neither I know how does it handle keyboard layout switching.

Update

Qt5 doesn't have QWS and all QWS-related APIs are removed. So you'll need some thirdparty solution. Or write a plugin for QPA.

OTHER TIPS

I need a way to type non-US characters

You can change qmap, but even in Qt 4.8.0 there is no way to switch between US and russian (for example). You need to patch kmap2qmap (add AltGr_Lock support), qkbd_qws.cpp (change testmods according to state of AltGr_Lock). It's looks like no one is used QtEmbedded with keyboard. Or all keeps final patches in secret place.

Can't comment, so this is the answer to

You need to patch kmap2qmap (add AltGr_Lock support), qkbd_qws.cpp (change testmods according to state of AltGr_Lock).

This simple patch to qkbd_qws.cpp enables switch beteewn languages by the CapsLock button.

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;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top