我建造了Malit(https://wiki.maliit.org/Main_Page)我的Ubuntu桌面的虚拟屏幕键盘,它和附带的示例应用程序配合得很好。我还能够制作自己的简单Qt示例应用程序,当小部件占据焦点时,该应用程序将显示键盘。
我现在正试图将虚拟键盘部署到一个嵌入式Linux系统上,该系统运行在我的目标板上,带有触摸屏。目标板上没有安装X11,我用QWS(-QWS)运行了很多Qt应用程序。
Malit架构(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
这意味着示例应用程序主要在以下行失败:
// 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声称与Malit的QWS对他有效,至少他能看到输入。。
还有一种Malit模式据说可以绕过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
我在Ubuntu 12.04 Desktop上构建了Qt 4.8.2 Embedded,可以使用-qws和示例应用程序启动malit服务器,并且可以使用qws看到虚拟键盘工作得很好。我正在为插件和malit框架使用git repo的最新克隆。
我的问题是在目标上运行相同的malit服务器和为我的ARM板编译的示例应用程序。我经常收到错误QApplication::setInputContext:用0输入上下文调用。
我使用DBUS DBUS监视器工具进行了一些监视。我最初向我的板打开了1个SSH会话,并运行evaldbus-launch --auto-syntax
并复制了DBUS_session_BUS。然后我打开了两个新的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监视器外壳中,我看到:
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