在QWebView中设置文本输入焦点

时间:2013-10-02 14:30:58

标签: c++ qt qwebview

我正在尝试在QWebView中显示Google登录对话框,我记得,Google喜欢将键盘焦点设置为页面上的第一个输入字段(在本例中为电子邮件字段)。 / p>

不幸的是,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键,然后继续产生奇怪的结果。

如果我手动将焦点放在密码字段中,并按下Control键,我注意到我会继续在密码字段中使用键盘焦点,但在电子邮件字段中有“视觉”焦​​点:

Keyboard caret in the wrong field

此外,当我在此“状态”中键入内容时,在视觉和键盘焦点“重置”到密码字段之前,偶尔会有一封信“泄漏”到电子邮件字段中:

Character leaking

是否有正确的方法将键盘焦点重定向到我选择的输入字段?

2 个答案:

答案 0 :(得分: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);
    }
}

在我看来,这看起来像是一个'黑客'解决方案,所以如果有一个'正确'的方法来做到这一点,我会全力以赴。

答案 1 :(得分:0)

pgh是对的。在应用程序的初始化过程中,只需将焦点放在QWebView对象上即可。

m_webView->setFocus();