2013-03-11 30 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)。