QtWebkit:如何在<input />字段上挂钩虚拟键盘

时间:2013-03-11 14:04:28

标签: html input embedded qtwebkit

我正在使用嵌入式Webkit浏览器(在Linux上使用Qt 4.8.0),它可以在电视机上使用遥控器运行。 到目前为止,我已经完成了所有工作,现在我正在尝试处理网页中的<input>标记。

我想要发生的事情是:每当选择输入字段时,我想弹出我的虚拟键盘并让用户使用遥控器输入文本,然后将结果推回到。

我已经尝试了几种方法来做到这一点:

  • 使用QInputContext安装this tutorial:我看到没有事件通过我安装的InputContext。
  • 在我的浏览器的不同阶段(在QApp中,在QGraphicsWebPage中,在QGraphicsWebView中)重新实现各种eventFilter():我看到事件的LOADS,但从未看到我感兴趣的事件({{ 1}} / QEvent::RequestSoftwareInputPanel / QEvent::CloseSoftwareInputPanel / FocusIn / FocusOut / Enter)。
  • 使用Leave给出了与前一点相同的结果。

由于我没有使用鼠标,因此我无法处理“鼠标悬停”或“鼠标点击”等事件,以确定installSceneEventFilter()元素是否已被聚焦。

所以我想知道如何连接到网页中的任何<input>来检测焦点何时到达它。请注意,即使<input>字段是动态通过页面中的Javascript脚本插入,我想这也必须有效。

我可以连接到Qt信号吗? 如何处理动态插入的新输入表单?

我还没有探索过可能的解决方案:在我的arch中使用mkspecs中的<input>,然后过滤应该传递的QEvent :: EnterEditFocus。我宁愿坚持现在的香草Qt,所以这是一个极端(我不确定会有效)。

1 个答案:

答案 0 :(得分:1)

对于那些对解决方案感兴趣的人,这里是:

  • 使用addToJavascriptWindowObject()插入您自己的C ++对象,该对象至少有一个方法:showMultitap(cont QWebElement&)。假设您插入名称为“multitap”。

  • 注入如下所示的javascript代码:

    document.addEventListener("focus", function(e){
        window.multitap.showMultitap(e); // will land in your C++ object
    }, true);
    

在实际显示VK之前,检查C ++处理程序中元素是文本元素。

  • 您将遇到的一个问题是您无法仅使用键盘(或远程)箭头退出文本字段,因此您必须在Qt编译过程中添加DEFINES += QT_KEYPAD_NAVIGATON(最好是把它们放在你的拱门的qmakespec中。)