如何防止 QWebEngineView 将注意力集中在 setHtml(...) 和 load(...) 调用上?

Posted

技术标签:

【中文标题】如何防止 QWebEngineView 将注意力集中在 setHtml(...) 和 load(...) 调用上?【英文标题】:How to prevent QWebEngineView to grab focus on setHtml(...) and load(...) calls? 【发布时间】:2016-04-13 21:00:04 【问题描述】:

我用QTreeViewQWebEngineView 创建了简单的Qt 窗口布局:在树视图中选择了一些项目后,Web 引擎视图显示了一些内容。问题是当QWebEngineView::sethtml(...)load(...) 被调用时,树视图失去了键盘焦点,而Web 引擎视图得到了它。这会导致在树视图中使用键盘选择项目时遇到困难。那么,如何防止树视图焦点丢失呢?

我尝试使用QTextBrowser 而不是QWebEngineView。没有这个问题,但是不适合复杂的HTML页面。

【问题讨论】:

【参考方案1】:

假设我们有:

QWebEngineView *webView = new QWebEngineView;

对于 Qt 5.8 和更新版本

这个问题可以通过调整设置来解决:

webView->settings()->setAttribute(QWebEngineSettings::FocusOnNavigationEnabled, false);

示例代码:https://github.com/rmisev/FocusWidget/tree/if-qt-5.8

参考文献:

QWebEngineView::settings() QWebEngineSettings Class QWebEngineSettings::setAttribute(WebAttribute attribute, bool on) QTBUG-52999

对于 Qt 5.7 及更早版本

最简单的解决方案(@Netrix 也指出)是调用:

webView->setEnabled(false);

但这会禁用webView 的键盘输入。

为了解决这个问题,我创建了简单的FocusWidget 类作为webView 的父小部件,其工作原理如下:

    最初它会禁用webView (webView->setEnabled(false)),因此会阻止关注load(...)setHtml(...) 调用。 当FocusWidget 获得焦点时,它启用并将焦点转发给webView,因此启用键盘输入。 当webView 及其子级失去焦点时,FocusWidget 会再次禁用webView

源代码和示例应用程序:https://github.com/rmisev/FocusWidget

【讨论】:

我认为这是一个过于复杂的解决方案,因为您可以通过禁用 webview、调用 reload() 或 setHtml() 然后在三行代码中重新启用它来规避这个问题!如果没有这个答案,我不会意识到这一点。 我喜欢你回答“对于 Qt 5.8 和 never”中的错字(我认为?)哈哈,因为它可以被解释为“不要这样做" ^^【参考方案2】:

我在 PyQt5 的应用中遇到了同样的问题。我设法做的是像这样禁用整个小部件(在 Python 中):

view = PyQt5.QtWebEngineWidgets.QWebEngineView()
view.setEnabled(False)

这导致视图可以通过鼠标操作(它接受鼠标点击并且可以在网页上更改内容)但我不会从不同的小部件获得焦点。

我肯定会称其为错误而不是 QtWebEngineWidgets 中的功能。

【讨论】:

+1 为答案。一开始我也在考虑这样的解决方案,但是因为它禁用了QWebEngineView的键盘输入,所以我想到了如何规避这个缺点。我发布了我的解决方案。【参考方案3】:

感谢所有为此提供答案的其他人。遇到这个错误后,我有点难过,但是在了解了 setEnabled(false) 影响从其他答案中窃取焦点的方式后,我发现只需禁用 webview、设置 html 或重新加载它,然后重新启用它就可以规避问题(至少在 Qt 5.7 中):

I.E.

myWebView->setEnabled( false );
myWebView->setHtml( html );
myWebView->setEnabled( true );

myWebView->setEnabled( false );
myWebView->reload();
myWebView->setEnabled( true );

这允许您解决问题,而无需像其他答案之一所建议的那样对任何东西进行子类化。

【讨论】:

以上是关于如何防止 QWebEngineView 将注意力集中在 setHtml(...) 和 load(...) 调用上?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QWebEngineView 中禁用工具提示(标题)的自动换行

如何将 swf 文件从内存加载到 QWebEngineView

如何将 html 附加到我的 QWebEngineView

如何将 QWebEngineProfile 设置为 QWebEngineView

如何在 QWebEngineView 周围显示边框?

QWebEngineView - 如何在系统浏览器中打开链接