Qt虚拟键盘和QInputContextFactory

时间:2012-09-28 20:55:48

标签: c++ qt qt4 user-input virtual-keyboard

我为我的Ubuntu桌面构建了Maliit(https://wiki.maliit.org/Main_Page)虚拟屏幕键盘,它与包含的示例应用程序配合得很好。我还能够创建我自己的简单Qt示例应用程序,当小部件假定为焦点时显示键盘。

我现在正尝试将虚拟键盘部署到带有触摸屏的目标板上运行的嵌入式Linux系统中。目标板上没有安装X11,我使用QWS(-qws)运行了很多Qt应用程序。

Maliit架构(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输入上下文错误。

这里有一个错误 - >声称QWS与Maliit合作的https://bugs.maliit.org/show_bug.cgi?id=185正在为他工作,至少他可以看到输入..

还有一种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

我在Ubuntu 12.04 Desktop上构建了Qt 4.8.2 Embedded,可以使用-qws以及示例应用程序启动maliit-server,并且可以看到虚拟键盘使用QWS正常工作。我正在使用插件和maliit-framework的git repo的最新克隆。

我的问题是在目标上为我的ARM板运行相同的maliit-server和示例app。我经常得到错误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 shell中我看到:

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失败有关吗?我可以以某种方式获得有关失败的更多信息以及我无法设置输入上下文的原因吗?

感谢您的帮助 -

1 个答案:

答案 0 :(得分:3)

难以置信,这么简单的修复。只需像这样设置QT_PLUGIN_PATH:

export QT_PLUGIN_PATH=/home/user/plugins