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
Version 4.6 has gained keymap support. Solution:
generate kmap file:
ckbcomp -layout xx > xx.kmap
convert kmap to qmap
kmap2qmap xx.kmap xx.qmap
load keymap either by
specifying QWS_KEYBOARD environment variable:
QWS_KEYBOARD="TTY:keymap=xx.qmap"
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.
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;