我用 QTreeView
和 QWebEngineView
创建了简单的 Qt 窗口布局:在 TreeView 中选择一些项目后,Web 引擎 View 会显示一些内容。问题是当调用 QWebEngineView::setHtml(...)
或 load(...)
时, TreeView 会失去键盘焦点,而 Web 引擎 View 会得到它。这会导致在 TreeView 中使用键盘选择项目时遇到困难。那么,如何防止 TreeView 焦点丢失呢?
我尝试使用 QTextBrowser
而不是 QWebEngineView
。没有这个问题,但是不适合复杂的HTML页面。
最佳答案
假设我们有:
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
关于qt - 如何防止 QWebEngineView 将注意力集中在 setHtml(...) 和 load(...) 调用上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36609489/