在QWebView中设置文本输入焦点
我试图在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键,并继续产生奇怪的结果。
如果我手动将焦点放在密码字段中,然后按下Ctrl键,我注意到我将继续在密码字段中键入焦点,但在电子邮件字段中具有“可视”焦点:
另外,当我在这个“状态”中输入某些内容时,在视觉和键盘焦点将“重置”到密码字段之前,偶尔有一封信可能“泄漏”到电子邮件字段中:
有没有适当的方法将键盘焦点重定向到我选择的输入字段?
我设法通过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);
}
}
在我看来,这看起来像是一种'黑客'式的解决方案,所以如果有'正确'的方式来做到这一点,我就会全神贯注。
pgh是对的。 只需在应用程序初始化期间将焦点设置在QWebView对象上。
m_webView->setFocus();
链接地址: http://www.djcxy.com/p/6689.html
上一篇: Setting text input focus within a QWebView
下一篇: How to set focus to the playing field after I have pushed buttons