如何在屏幕外窗口中渲染焦点指示器?

How to render focus indicators in an offscreen window?

本文关键字:焦点 指示器 窗口 屏幕      更新时间:2023-10-16

我正在尝试使用Qt在虚拟现实中实现自定义用户界面。 我正在使用QQuickRenderControl将QML中定义的一些UI渲染到OpenGL帧缓冲区中。
生成的纹理将绘制到我的自定义 OpenGL 场景中的四边形上。使用运动控制器模拟鼠标事件。

这一切都很好用,但我无法以"活动"或"专注"样式呈现 UI。例如,如果我激活一个文本字段,则没有光标,也没有蓝色轮廓,因为屏幕外窗口(QQuickWindow)不被视为活动窗口。它实际上从未显示在桌面上 - 它只存在于内存中。

如果我强制在桌面上显示窗口并使其成为应用程序的前窗口,则活动文本字段将正确呈现,焦点轮廓和光标位于 VR 场景中。但是,我想避免在桌面上显示此窗口(它呈现为空的白色窗口)。

有没有办法强制QQuickWindow渲染,就好像它是前窗一样,即使不是这样?

m_quickWindow->setX(-m_quickWindow->width());
m_quickWindow->setY(-m_quickWindow->height());
m_quickWindow->setFlag(Qt::SplashScreen);
m_quickWindow->show();

Qt 5.11 没关系

m_quickWindow->setOpacity(0.f);
m_quickWindow->setFlags(Qt::SplashScreen | Qt::WindowTransparentForInput);
m_quickWindow->show();

更好的解决方案 - 适用于Qt 5.15

但它看起来并不好。