Я собрал виртуальную экранную клавиатуру Maliit (https://wiki.maliit.org/Main_Page) для своего рабочего стола Ubuntu, и она прекрасно работает с прилагаемыми примерами приложений. Я также смог создать свой собственный простой пример приложения Qt, который бы отображал клавиатуру, когда виджет получил фокус.
Сейчас я пытаюсь развернуть виртуальную клавиатуру во встроенной системе Linux, работающей на моей целевой плате, с сенсорным экраном. На целевой плате не установлен X11, и я запускаю довольно много приложений Qt с QWS (-qws).
Малиитская архитектура ( http://maliit.org/doc/framework/latest/architecture.html ) требует, чтобы экземпляр сервера взаимодействовал с приложением, и приложение устанавливает его входной контекст, используя QApplication :: setInputContext.
На Ubuntu я просто делаю:
export QT_IM_MODULE=Maliit
maliit-server -software &
maliit-exampleapp-plainqt
И клавиатура появляется и все работает (если у меня есть X11)!
На встроенной плате я делаю в одной сессии SSH:
export QT_IM_MODULE=Maliit
dbus-launch --auto-syntax maliit-server -software -qws
А затем еще один сеанс SSH:
export QT_IM_MODULE=Maliit
source /find_dbus_address.sh
echo $DBUS_SESSION_BUS_ADDRESS
maliit-exampleapp-plainqt -qws
Но я всегда получаю ошибку:
QApplication::setInputContext: called with 0 input context
Это означает, что пример приложения терпит неудачу в main в следующей строке:
// Workaround for lighthouse Qt
kit.setInputContext(QInputContextFactory::create("Maliit", &kit));
Вывод команды ‘ps’ на встроенной плате показывает следующее:
191 user 1692 S -sh
192 user 39608 S maliit-server -software -qws
196 user 2092 S /usr/bin/dbus-daemon --fork --print-pid 4 --print-address 6 --session
201 user 1692 R ps
Таким образом, сервер не работает активно, как в Ubuntu … но находится в состоянии прерывистого сна. Мышь движется в этом состоянии. Я все еще получаю 0 контекста ошибки.
Здесь есть ошибка -> https://bugs.maliit.org/show_bug.cgi?id=185 который утверждает, что QWS с Малиитом работает на него, по крайней мере, он может видеть ввод ..
Существует также режим Maliit, который якобы обходит DBUS (см. Здесь -> http://www.jonnor.com/2012/03/ ) и с этим я все еще получаю ошибки «0 входной контекст»:
Итак, я попытался сделать на моей встроенной плате:
export QT_IM_MODULE=MaliitDirect ; echo $QT_IM_MODULE ; maliit-exampleapp-embedded -qws
И всегда получаю:
QApplication::setInputContext: called with 0 input context
Unable to embedded Maliit input method widget
Я построил Qt 4.8.2 Embedded на Ubuntu 12.04 Desktop и могу запускать maliit-сервер с -qws, а также приложениями-примерами и вижу, что виртуальная клавиатура работает просто отлично, используя QWS. Я использую последний клон для репозитория git для обоих плагинов и maliit-framework.
Моя проблема заключается в запуске того же maliit-сервера и примера приложения, скомпилированного для моей платы ARM на цели. Я постоянно получаю ошибку QApplication :: setInputContext: вызывается с 0 входным контекстом.
Я провел некоторый мониторинг с помощью инструмента DBUS dbus-monitor. Первоначально я открыл 1 сеанс SSH для своей доски и побежал Eval dbus-launch --auto-syntax
и скопировал DBUS_SESSION_BUS. Затем я открыл 2 новых сессии SSH.
В первом я сделал:
$ export DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-vVNCW9zP7e,guid=75ecd72645dfb9b4358048db506dfec
$ export QT_IM_MODULE=Maliit
$ maliit-server -software -qws
Во втором я сделал:
$ export DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-vVNCW9zP7e,guid=75ecd72645dfb9b4358048db506dfecb
$ export QT_IM_MODULE=Maliit
$ maliit-exampleapp-settings -qws
Однако я сразу столкнулся с:
[9;0]QApplication::setInputContext: called with 0 input context
SettingsWidget::connected()
SettingsWidget::pluginSettingsReceived()
Setting layout QVariant(QString, "nemo-keyboard.qml:")
И в оболочке dbus-monitor я вижу:
desktop.DBus; member=NameOwnerChanged
string ":1.6"string ""string ":1.6"method call sender=:1.6 -> dest=org.freedesktop.DBus serial=1 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=Hello
signal sender=org.freedesktop.DBus -> dest=(null destination) serial=8 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
string "org.maliit.server"string ""string ":1.6"method call sender=:1.6 -> dest=org.freedesktop.DBus serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=RequestName
string "org.maliit.server"uint32 4
signal sender=org.freedesktop.DBus -> dest=(null destination) serial=9 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
string ":1.7"string ""string ":1.7"method call sender=:1.7 -> dest=org.freedesktop.DBus serial=1 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=Hello
method call sender=:1.7 -> dest=org.maliit.server serial=2 path=/org/maliit/server/address; interface=org.freedesktop.DBus.Properties; member=Get
string "org.maliit.Server.Address"string "address"method return sender=:1.6 -> dest=:1.7 reply_serial=2
variant string "unix:abstract=/tmp/maliit-server/dbus-CPgFHrxwAi,guid=dfc1dfc367a647e36e6e4c3c506e00db"
Кто-нибудь имеет представление о том, что здесь происходит? Может ли DBUS иметь какое-то отношение к сбою QInputContextFactory? Могу ли я как-то получить больше информации о том, что не работает, и почему я не могу установить свой входной контекст?
Спасибо за помощь —
Невероятно, такое простое исправление. Просто установите QT_PLUGIN_PATH так:
export QT_PLUGIN_PATH=/home/user/plugins
Других решений пока нет …