我正在尝试在QWebView中显示Google登录对话框,我记得,Google喜欢将键盘焦点设置为页面上的第一个输入字段(在本例中为电子邮件字段)。 / p>
不幸的是,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键,我注意到我会继续在密码字段中使用键盘焦点,但在电子邮件字段中有“视觉”焦点:
此外,当我在此“状态”中键入内容时,在视觉和键盘焦点“重置”到密码字段之前,偶尔会有一封信“泄漏”到电子邮件字段中:
是否有正确的方法将键盘焦点重定向到我选择的输入字段?
答案 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)
m_webView->setFocus();