如何防止 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 【问题描述】:我用QTreeView
和QWebEngineView
创建了简单的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