如何防止QWebEngineView专注于setHtml(...)和加载(...)调用?

时间:2016-04-13 21:00:04

标签: qt focus qtwebengine

我使用QTreeViewQWebEngineView创建了简单的Qt窗口布局:在树视图中选择一些项目后,Web引擎视图会显示一些内容。问题是当调用QWebEngineView::setHtml(...)load(...)时树视图失去键盘焦点并且Web引擎视图获取它。在树视图中选择带键盘的项目时,这会造成困难。那么,如何防止树视图焦点丢失?

我尝试使用QTextBrowser代替QWebEngineView。它没有这个问题,但它不适用于复杂的HTML页面。

3 个答案:

答案 0 :(得分:6)

假设我们有:

QWebEngineView *webView = new QWebEngineView;

对于Qt 5.8,从不

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

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

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

参考文献:

对于Qt 5.7及更早版本

最简单的解决方案(也由@Netrix指出)是致电:

webView->setEnabled(false);

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

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

  1. 最初它会停用webViewwebView->setEnabled(false)),因此无法关注load(...)setHtml(...)来电。
  2. FocusWidget获得焦点时,它会将焦点转移到webView,从而启用键盘输入。
  3. webView及其子女失去焦点时,FocusWidget再次停用webView
  4. 源代码和示例应用程序:https://github.com/rmisev/FocusWidget

答案 1 :(得分:2)

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

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

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

我肯定会把它称为bug而不是QtWebEngineWidgets中的功能。

答案 2 :(得分:1)

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

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

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

这使您可以解决问题,而无需像其他答案建议的那样对任何内容进行子类化。