我正在尝试在 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 键,我注意到我将继续在密码字段中获得键盘焦点,但在电子邮件字段中具有“视觉”焦点:
此外,当我在这种“状态”下输入内容时,有时在视觉和键盘焦点“重置”到密码字段之前,一封信可能会“泄漏”到电子邮件字段中:
是否有将键盘焦点重定向到我选择的输入字段的正确方法?