2013-10-02 75 views
2

我試圖在QWebView中顯示Google登錄對話框,並且我記得Google喜歡將您的鍵盤焦點設置爲頁面上的第一個輸入字段(在這種情況下,電子郵件字段)。在QWebView中設置文本輸入焦點

不幸的是,QWebView控件實際上不尊重這種行爲,並因此與鍵盤焦點加載頁面上什麼都沒有:

Login dialog with no focus

所以我決定挖約一點點,並插入該代碼段到類的邏輯:

void GoogleAuthDialog::pageLoaded(bool ok) { 
    if (ok) { 
     ui->webView->setFocus(); 
     ui->webView->page()->mainFrame()->setFocus(); 
     QWebElement el = ui->webView->page()->mainFrame()->findFirstElement("input:not([type=hidden])"); 
     if (!el.isNull()) { 
      el.setFocus(); 
      el.evaluateJavaScript("this.focus()"); 
      el.evaluateJavaScript("this.click()"); 
     } 
    } 
} 

而在我的頭文件中聲明如下:

... 
private slots: 
    void pageLoaded(bool); 

早在類的代碼,我連從QWebView適當的信號,以我的槽:

connect(ui->webView, SIGNAL(loadFinished(bool)), this, SLOT(pageLoaded(bool))); 

是的,我扔一切可能的事情我能想到的,在它的鍵盤焦點重定向到第一輸入框。

不幸的是,代碼似乎沒有工作,因爲它雖然專注在正確的輸入框,我不能在它的內部,直到我點擊它自己輸入任何東西,或按下Tab鍵:

Focus with no keyboard

接下來,我將該函數綁定到我的Control鍵,並繼續產生奇怪的結果。

如果我把主要精力投入到密碼字段中手動,並按下控制鍵,我注意到,我會繼續在密碼字段鍵盤焦點,但在電子郵件領域的「視覺」重點:

Keyboard caret in the wrong field

此外,當我輸入的東西在這個「國家」,偶爾有封信可能「泄漏」到電子郵件領域的視覺和鍵盤焦點將「重置」的口令字段前:

Character leaking

有沒有適當的方法將鍵盤焦點重定向到我選擇的輸入字段?

+0

看看,HTH:http://stackoverflow.com/questions/2843998/how-get-a-focus-element-in-qwebview-qwebpage – duDE

+0

@duDE謝謝你的鏈接,但我不相信傾聽焦點事件實際上會幫助我直接集中鍵盤輸入。 – TheFuzzy

回答

3

我設法通過模擬標籤通過QKeyEvent重點重定向鍵盤輸入焦點:

void GoogleAuthDialog::pageLoaded(bool ok) { 
if (ok) { 
    //Gets the first input element 
    QWebElement el = ui->webView->page()->currentFrame()->findFirstElement("input:not([type=hidden])"); 
    if (!el.isNull()) { 
     el.setFocus(); 
    } 
    // Simulate a forward tab, then back. 
    QKeyEvent *forwardTab = new QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier); 
    QKeyEvent *backwardTab = new QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier); 
    QCoreApplication::postEvent(ui->webView, forwardTab); 
    QCoreApplication::postEvent(ui->webView, backwardTab); 
    } 
} 

在我看來,這似乎像一個「黑客十歲上下的解決方案,所以如果有一個「正確的」這樣做的方式,我都耳熟能詳。

+0

在聚焦元素本身之前,我只是通過聚焦包含webview的問題來解決一個或多或少相同的問題。 雖然你的Tab鍵入侵很好! –

0

pgh是對的。只需在應用程序初始化期間將焦點設置在QWebView對象上。

m_webView->setFocus();