2013-03-11 97 views
1

我正在使用电视机上的远程控制器运行嵌入式Webkit浏览器(在Linux上使用Qt 4.8.0)。 我几乎所有工作到目前为止,我现在试图处理网页中的<input>标记。QtWebkit:如何挂接<input>字段上的虚拟键盘

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

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

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

因为我不使用鼠标,我不能处理像“鼠标悬停”或事件“鼠标单击”确定是否<input>元素集中。

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

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

可能的解决方案我还没有探索:使用mkspecs中的QT_KEYPAD_NAVIGATION作为我的拱门,然后过滤应该通过的QEvent :: EnterEditFocus。我宁愿坚持我现在拥有的香草Qt,所以这是一个极端(我不知道会起作用)。

回答

1

对于那些有兴趣在该解决方案,那就是:

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

  • 注入JavaScript代码,如下所示:

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

而在你的C++处理程序检查元素实际上显示VK之前的文本元素。

  • 一个问题,你必须是你不能退出文本字段键盘上的按键(或远程)箭头,所以你必须添加DEFINES += QT_KEYPAD_NAVIGATON到你的Qt编译过程(最好是把他们在你的拱门的qmakespecs)。