3

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

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

4

3 回答 3

7

假设我们有:

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. 最初它禁用webView( webView->setEnabled(false)),因此防止将注意力集中在load(...),setHtml(...)调用上。
  2. FocusWidget获得焦点时,它启用并将焦点转发到webView,因此启用键盘输入。
  3. webView和它的孩子失去焦点,再次FocusWidget禁用webView

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

于 2016-05-29T20:29:44.027 回答
2

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

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

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

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

于 2016-05-26T19:13:31.033 回答
1

Thanks to all the others who provided answers for this. After encountering this bug I was somewhat stumped, but after learning of the way setEnabled(false) affects the focus stealing from the other answers I discovered that simply disabling the webview, setting the html or reloading it, then re-enabling it circumvents the issue (at least in Qt 5.7):

I.E.

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

or

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

This allows you to fix the problem without needing to subclass anything as one of the other answers suggests.

于 2016-12-11T22:29:03.887 回答