我使用QTreeView
和QWebEngineView
创建了简单的Qt窗口布局:在树视图中选择一些项目后,Web引擎视图会显示一些内容。问题是当调用QWebEngineView::setHtml(...)
或load(...)
时树视图失去键盘焦点并且Web引擎视图获取它。在树视图中选择带键盘的项目时,这会造成困难。那么,如何防止树视图焦点丢失?
我尝试使用QTextBrowser
代替QWebEngineView
。它没有这个问题,但它不适用于复杂的HTML页面。
答案 0 :(得分:6)
假设我们有:
QWebEngineView *webView = new QWebEngineView;
可以通过调整设置来解决问题:
webView->settings()->setAttribute(QWebEngineSettings::FocusOnNavigationEnabled, false);
示例代码:https://github.com/rmisev/FocusWidget/tree/if-qt-5.8
参考文献:
最简单的解决方案(也由@Netrix指出)是致电:
webView->setEnabled(false);
但这会禁用webView
的键盘输入。
为了解决这个问题,我创建了简单的FocusWidget
类作为webView
的父窗口小部件,其工作原理如下:
webView
(webView->setEnabled(false)
),因此无法关注load(...)
,setHtml(...)
来电。FocusWidget
获得焦点时,它会将焦点转移到webView
,从而启用键盘输入。webView
及其子女失去焦点时,FocusWidget
再次停用webView
源代码和示例应用程序: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 );
这使您可以解决问题,而无需像其他答案建议的那样对任何内容进行子类化。