在 Win 7 上使用带 ANGLE 的 Qt 时出现空白窗口
Posted
技术标签:
【中文标题】在 Win 7 上使用带 ANGLE 的 Qt 时出现空白窗口【英文标题】:Blank window when using Qt with ANGLE on Win 7 【发布时间】:2017-01-03 19:38:16 【问题描述】:我有一个 Qt Quick 2 应用程序 (QML),它在某些 Windows PC 上显示一个空白窗口。有什么办法可以治愈吗?
我知道 Qt Quick 2 需要使用 OpenGL 2.0 在某些 Windows PC 上造成了类似的问题,尤其是在配备 Intel 显卡的 PC 上。我采用的解决方案是在为 Windows 编译时强制使用 ANGLE。这非常成功,除了几台 PC,它们显示一个空白窗口(通常是白色)并且如果您切换到应用程序并切换回应用程序,则无法重绘。
下面是一个演示问题的简短测试应用。正确运行时,要确认使用 ANGLE,它应该显示一个带有绿色背景和圆形白色鼠标光标的窗口。如果未使用 ANGLE,那么您将获得红色背景和鼠标光标(例如 MacOS)。你永远不应该得到一个空白窗口。
一台出现问题的 PC 正在运行 Windows 7 32 位家庭高级版 SP1 并具有英特尔图形媒体加速器 3600 系列 (Atom N2800)。
test.pro
TEMPLATE = app
TARGET = Test
QT += qml quick
SOURCES += main.cpp
RESOURCES += qml.qrc
main.cpp
#include <QGuiApplication>
#include <QQmlEngine>
#include <QQuickView>
int main(int argc, char *argv[])
#ifdef Q_OS_WIN
QGuiApplication::setAttribute(Qt::AA_UseOpenGLES);
#endif
QGuiApplication app(argc, argv);
QQuickView *view = new QQuickView;
view->connect(view->engine(), SIGNAL(quit()), &app, SLOT(quit()));
view->setSource((QUrl(QStringLiteral("qrc:/qml/main.qml"))));
view->show();
return app.exec();
qml.qrc
<RCC>
<qresource prefix="/">
<file>qml/main.qml</file>
</qresource>
</RCC>
qml/main.qml
import QtQuick 2.5
Rectangle
id: root
width: 600
height: 400
color: (OpenGLInfo.renderableType == OpenGLInfo.Unspecified?
'#333': (OpenGLInfo.renderableType == OpenGLInfo.OpenGL?
'#c00': '#0c0'))
MouseArea
id: mainMouseArea
anchors.fill: parent
hoverEnabled: true
onPositionChanged: mousePointer.position = Qt.point(mouse.x, mouse.y)
Rectangle
id: mousePointer
property point position: Qt.point(-1000,-1000)
width: 60
height: width
radius: width / 2
x: position.x - width / 2
y: position.y - height / 2
color: "white"
【问题讨论】:
【参考方案1】:首先确保已安装英特尔最新的 GPU 驱动程序。 GPU 已经很旧了,所以可能只是由于驱动程序错误而无法与 ANGLE 一起使用。在这种情况下,Qt 可以检测到这一点并切换到软件渲染,但前提是您不强制 Qt 使用 ANGLE。此外,您可以通过设置 QT_LOGGING_RULES=qt.qpa.gl=true
环境变量来启用 Qt 平台抽象 (qpa) 日志记录,这将记录有关渲染后端的大量有用信息。
您可以尝试以下几点:
确保部署所需的 dll 文件:libGLESv2.dll
、d3dcompiler47.dll
(Windows SDK 提供的最新版本)、libEGL.dll
以及 opengl32sw.dll
(用于软件渲染)。最简单的方法是使用windeployqt
。
使用 qtdiag
二进制文件确定 Qt 使用哪个渲染后端(当不强制为 ANGLE 时)。
使用QT_OPENGL
(请参阅Qt5 Documentation)和QT_ANGLE_PLATFORM
环境变量(请参阅Qt5 Documentation)进行实验。
检查有问题的 GPU 是否为 blacklisted by Qt。它可能被 ANGLE 和/或 OpenGL 后端列入黑名单。设备 ID 和驱动程序版本可以通过使用启用了 qpa 日志记录的qtdiag
获得(见上文)。
【讨论】:
有趣的是,您说 GPU 可能无法使用 ANGLE。我知道有些 GPU 不适用于本机/桌面,但我不知道 ANGLE 可能存在问题。我将尝试启用 qpa - 我是在 main.cpp 中使用 QProcessEnvironment 设置环境变量还是可以在 .pro 中完成? 您可以在全局(控制面板 -> 系统)、在运行可执行文件之前在您的 cmd 提示符 (set QT_LOGGING_RULES=qt.qpa.gl=true
) 中执行此操作,也可以通过 Qt Creator run
设置执行此操作。不幸的是,使用 QProcessEnvironment 或任何其他编程方式为时已晚。
谢谢。刚刚有机会在有问题的 PC 上重新测试。我已经确定它有最新的驱动程序,所以这次我测试了 OpenGL 软件渲染并解决了问题。甜。
这是 2017 年 1 月 18 日发布的有关 OpenGL 和 QtQuick 的相关新 Qt 博客文章:Which OpenGL implementation is my Qt Quick app using today?以上是关于在 Win 7 上使用带 ANGLE 的 Qt 时出现空白窗口的主要内容,如果未能解决你的问题,请参考以下文章
在win-10中部署的qt-designer项目在win-7中不起作用
Qt 是不是使用 opengl=angle 修复支持不支持 opengl 2.0 的 Windows 客户端?