2013-10-02 35 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();