远程桌面上的 Qt 应用程序外观 运行
Qt Application Appearance Running Over Remote Desktop
我在桌面应用程序上工作,有时我们必须 运行 在虚拟机上使用 Windows 远程桌面进行访问。 运行通过远程桌面连接时,字体和渐变的外观明显变差。字体显然不是 anti-aliased(通常是)渐变退化为更大的纯色带,失去了更平滑的外观。最初,我假设 Windows 这样做是为了提高性能,但是当我将我们的产品中的应用程序字体与其他应用程序中的应用程序字体(特别是 Visual Studio )进行比较时,我发现 Qt 肯定是在对话框中呈现字体和 QGraphicsScene
不同。
在我的应用程序的应用程序标题栏中,我看到字体与其他应用程序标题栏的外观完全匹配,这是有道理的,因为 Windows 绘制了那个。在我的应用程序中,所有顶部菜单项和对话框上的字体都不是 anti-aliased,看起来很糟糕。我们广泛使用QGraphicsScene
,那些字体也被降级了。
我没有其他应用程序可以生成渐变来比较它们,但我使用 Windows 图像查看器通过远程桌面连接查看了高分辨率图像,它看起来和在本地桌面。
外观变差意味着我们无法在使用 VM 时对文档进行屏幕截图。我们还经常被要求使用 VM 和远程桌面进行演示,并且外观不吸引客户。在我们的行业和公司内部,使用 VM 而不是本地物理机器的压力越来越大,因此这正成为一个更大的问题。
这两种症状让我相信 Qt 知道我正在通过远程桌面进行可视化,并且它正在选择降低外观以提高性能。我不想那样,或者至少,我需要控制它。
我怀疑这被埋在 Qt 的 style/theme 系统中的某个地方,但我没有找到任何线索来指引我到正确的地方来做这件事,或者至少是一个答案表明它是否甚至可能。非常感谢任何建议。
QGraphicScene
我们有 OpenGL 用于渲染。对于一些 VM,我们主要依赖于通过 MS DirectX 模拟 OpenGL 的软件,这是针对软件而非硬件支持的渲染。最流行的软件OpenGL渲染是基于ANGLE.
为了改进 VM 上的渲染,我会尝试使用建议的 Qt build configurations 之一为您的应用程序构建自定义 Qt,以配置特定的 Windows Qt 构建。
随着 Qt 的发展,它变得有点混乱:哪种配置是最好的。有人告诉我,因为 Qt 5.5 -opengl dynamic
将是大多数环境的最佳选择。我曾经使用 Qt 5.3 配置 -opengl es2
配置并且在不降低图形质量的情况下运行良好但请注意,使用的 VM 来自 VMware 而不是 MS Hyper-V 由于 OpenGL 失败甚至不允许应用程序加载初始化,我无法让 ANGLE 来帮助解决这个特定的 Qt。
我能够解决 QGraphicsScene 中的字体问题。由于我们产品的性质,图形项目的字体处理相当专业,在开发的早期,当我刚接触 Qt 时,我将这些字体的样式策略设置为 QFont::ForceOutline,因为我没有不希望字体匹配使用任何位图字体。通过实验,我发现此策略导致在通过远程桌面 运行 时字体不会被消除锯齿。更改为 QFont::PreferAntialias 解决了场景中字体的问题,这是一个重大且受欢迎的改进。
不幸的是,我还没有找到通用应用程序字体的解决方案,也没有找到渐变退化的解决方案,但至少在字体方面,我还有更多的事情要做。我的下一步将是开始检查 Qt 在某些小部件上默认使用的字体并查看它们的属性。
我在桌面应用程序上工作,有时我们必须 运行 在虚拟机上使用 Windows 远程桌面进行访问。 运行通过远程桌面连接时,字体和渐变的外观明显变差。字体显然不是 anti-aliased(通常是)渐变退化为更大的纯色带,失去了更平滑的外观。最初,我假设 Windows 这样做是为了提高性能,但是当我将我们的产品中的应用程序字体与其他应用程序中的应用程序字体(特别是 Visual Studio )进行比较时,我发现 Qt 肯定是在对话框中呈现字体和 QGraphicsScene
不同。
在我的应用程序的应用程序标题栏中,我看到字体与其他应用程序标题栏的外观完全匹配,这是有道理的,因为 Windows 绘制了那个。在我的应用程序中,所有顶部菜单项和对话框上的字体都不是 anti-aliased,看起来很糟糕。我们广泛使用QGraphicsScene
,那些字体也被降级了。
我没有其他应用程序可以生成渐变来比较它们,但我使用 Windows 图像查看器通过远程桌面连接查看了高分辨率图像,它看起来和在本地桌面。
外观变差意味着我们无法在使用 VM 时对文档进行屏幕截图。我们还经常被要求使用 VM 和远程桌面进行演示,并且外观不吸引客户。在我们的行业和公司内部,使用 VM 而不是本地物理机器的压力越来越大,因此这正成为一个更大的问题。
这两种症状让我相信 Qt 知道我正在通过远程桌面进行可视化,并且它正在选择降低外观以提高性能。我不想那样,或者至少,我需要控制它。
我怀疑这被埋在 Qt 的 style/theme 系统中的某个地方,但我没有找到任何线索来指引我到正确的地方来做这件事,或者至少是一个答案表明它是否甚至可能。非常感谢任何建议。
QGraphicScene
我们有 OpenGL 用于渲染。对于一些 VM,我们主要依赖于通过 MS DirectX 模拟 OpenGL 的软件,这是针对软件而非硬件支持的渲染。最流行的软件OpenGL渲染是基于ANGLE.
为了改进 VM 上的渲染,我会尝试使用建议的 Qt build configurations 之一为您的应用程序构建自定义 Qt,以配置特定的 Windows Qt 构建。
随着 Qt 的发展,它变得有点混乱:哪种配置是最好的。有人告诉我,因为 Qt 5.5 -opengl dynamic
将是大多数环境的最佳选择。我曾经使用 Qt 5.3 配置 -opengl es2
配置并且在不降低图形质量的情况下运行良好但请注意,使用的 VM 来自 VMware 而不是 MS Hyper-V 由于 OpenGL 失败甚至不允许应用程序加载初始化,我无法让 ANGLE 来帮助解决这个特定的 Qt。
我能够解决 QGraphicsScene 中的字体问题。由于我们产品的性质,图形项目的字体处理相当专业,在开发的早期,当我刚接触 Qt 时,我将这些字体的样式策略设置为 QFont::ForceOutline,因为我没有不希望字体匹配使用任何位图字体。通过实验,我发现此策略导致在通过远程桌面 运行 时字体不会被消除锯齿。更改为 QFont::PreferAntialias 解决了场景中字体的问题,这是一个重大且受欢迎的改进。
不幸的是,我还没有找到通用应用程序字体的解决方案,也没有找到渐变退化的解决方案,但至少在字体方面,我还有更多的事情要做。我的下一步将是开始检查 Qt 在某些小部件上默认使用的字体并查看它们的属性。