2

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

不幸的是,QWebView 小部件实际上并不尊重这种行为,因此加载页面时键盘焦点根本没有:

没有焦点的登录对话框

所以我决定稍微挖掘一下,并将这段代码片段插入到我的类逻辑中:

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 键:

无键盘对焦

接下来,我将该功能绑定到我的 Control 键,并继续产生奇怪的结果。

如果我手动将焦点放在密码字段中,然后按 Control 键,我注意到我将继续在密码字段中获得键盘焦点,但在电子邮件字段中具有“视觉”焦​​点:

错误字段中的键盘插入符号

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

字符泄漏

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

4

2 回答 2

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);
    }
}

在我看来,这似乎是一个“hack-ish”解决方案,所以如果有一个“正确”的方法可以做到这一点,我会全力以赴。

于 2013-10-06T08:20:42.670 回答
0

pgh 是对的。只需在应用初始化期间将焦点设置在 QWebView 对象上。

m_webView->setFocus();
于 2014-03-20T20:19:41.377 回答