在 QWebView 中设置文本输入焦点
Posted
技术标签:
【中文标题】在 QWebView 中设置文本输入焦点【英文标题】:Setting text input focus within a QWebView 【发布时间】:2013-10-02 14:30:58 【问题描述】:我正在尝试在 QWebView 中显示 Google 登录对话框,我记得,Google 喜欢将您的键盘焦点设置为页面上的第一个输入字段(在本例中为电子邮件字段)。
不幸的是,QWebView 小部件实际上并不尊重这种行为,因此加载页面时键盘焦点根本没有任何内容:
所以我决定稍微挖掘一下,并将这段代码 sn-p 插入到我的类逻辑中:
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 键,我注意到我将继续在密码字段中获得键盘焦点,但在电子邮件字段中具有“视觉”焦点:
此外,当我在这种“状态”下输入内容时,有时字母可能会在视觉和键盘焦点“重置”到密码字段之前“泄漏”到电子邮件字段中:
是否有将键盘焦点重定向到我选择的输入字段的正确方法?
【问题讨论】:
看一看,HTH:***.com/questions/2843998/… @duDE 谢谢你的链接,但我不相信监听焦点事件实际上会帮助我直接关注键盘输入。 【参考方案1】:我设法通过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”解决方案,所以如果有一个“正确”的方法可以做到这一点,我会全力以赴。
【讨论】:
我刚刚解决了一个或多或少相同的问题,方法是先关注包含的 webview,然后再关注元素本身。不过,您的 Tab 键 hack 很不错!【参考方案2】:pgh 是对的。只需在应用初始化期间将焦点设置在 QWebView 对象上即可。
m_webView->setFocus();
【讨论】:
以上是关于在 QWebView 中设置文本输入焦点的主要内容,如果未能解决你的问题,请参考以下文章
如何在 UIView 中设置滚动视图以向上滑动被键盘隐藏的文本字段?