在全屏模式下运行 Qt 应用程序时出现“黑屏”问题

Posted

技术标签:

【中文标题】在全屏模式下运行 Qt 应用程序时出现“黑屏”问题【英文标题】:Issue with "blanking screen" when running Qt application in fullscreen mode 【发布时间】:2020-03-25 18:12:25 【问题描述】:

我们有一个基于 Qt 的浏览器应用程序,它在后台使用 QWebEninge。目前,我们正在解决一个问题,即每次窗口获得或失去焦点时(例如,每次调用 QVirtualKeyboard 时),屏幕都会出现片刻空白。在Qt's recommendation 之后,我们尝试在调用QMainWindow::showFullScreen() 之前实现QWindowsWindowFunctions::setHasBorderInFullScreen。但这会导致可用窗口面积的减少令人无法接受,例如1918x1078 而不是 1920x1080(此修复将 WS_BORDER 添加到窗口标志)。

在一些实验中,如果我使用QMainWindow::show() 并以与屏幕分辨率完全匹配的方式设置窗口大小时,如果发现问题也 - 并且仅 - 出现。换句话说:超出屏幕范围不是问题。因此,我的想法是在我的 QMainWinow 周围放置这样一个 WS_BORDER 并以某种方式调整/放置它,以便可用区域覆盖屏幕。

我的问题是:

有没有更好的解决方案来解决这个问题? 如果不是:我怎样才能获得“正常”QMainWinodwWS_BORDER?我尝试在调用QMainWinodw::show() 之前和之后都使用Get/SetWindowLongPtr(QMainWindow::winId(), GWL_STYLE/GWL_EXSTYLE),但这没有帮助。

提前致谢。

【问题讨论】:

注意:我已经注意到图形驱动程序在这里起着重要作用。范围内的系统具有 Intel HD Graphics 5xx GPU,驱动程序是最新的。在另一台配备 Intel HD Graphics 6xx GPU 的计算机上也发生了同样的情况。将 Windows 设置中的“高级图形设置”更改为“高性能”也无济于事。 【参考方案1】:

作为一种解决方法,我尝试使用 Qt::WindowStaysOnTopHint 放置一个隐藏的(不透明的)迷你窗口(0x0px) - 这很有效。如果有人知道更好的解决方案,请告诉我们。谢谢。

编辑 这是一个意外发现:Windows 的放大镜工具由于某种原因处于活动状态,我注意到当放大镜位于我的应用程序 Windows 前面时,问题不会发生。作为结论,我尝试放置一个“始终位于顶部”的窗口,并且可以看到它有效。最后我想隐藏这个“叠加层”,这是通过将它的宽度/高度设置为 0px/0px 来完成的。 但是,似乎存在一些关于 Qt 和范围内系统的英特尔高清显卡适配器的一般问题。据我记得,只有当(全屏)窗口的大小与显示器的几何形状相匹配时才会出现问题 - 至少将其大小调整为超出显示器几何形状的像素会有所帮助,但在我们的案例中这是没有选择的。

【讨论】:

您能否详细说明您的解决方案? @JoanVenge:编辑回答了你的问题吗? 我之前没有看到你的编辑。我刚读过它,所以您必须将全屏窗口的大小再调整 1 个像素?我遇到的问题也与英特尔驱动程序有关,我无法解决此问题。 是的,使用超出屏幕边界至少 1 像素的无框 Windows 是一种可能的解决方案。另一种方法是像以前一样使主窗口全屏显示,并在前面放置第二个使用 AlwaysOnTopHint 的“迷你窗口”。但是 - 正如提案中所述 - 这更像是一种解决方法而不是解决方案。

以上是关于在全屏模式下运行 Qt 应用程序时出现“黑屏”问题的主要内容,如果未能解决你的问题,请参考以下文章

创建一个即使在全屏模式下也保持在顶部的新窗口(Linux 上的 Qt)

MPMoviePlayerController 在全屏模式下向前搜索,直到结束卡住

在全屏 webview 诺基亚 x 中输入视频时出现 NullPointerException

在全屏模式下运行应用程序时,Java Swing 无法找出 JPanel 的问题

Qt虚拟键盘全屏

window.navigator.standalone 检测iOS WebApp是否运行在全屏模式