在 Win 7 上使用带有 ANGLE 的 Qt 时空白 window
Blank window when using Qt with ANGLE on Win 7
我的 Qt Quick 2 应用程序 (QML) 在某些 Windows PC 上显示空白 window。有什么办法可以解决这个问题吗?
我知道 Qt Quick 2 需要使用 OpenGL 2.0 在某些 Windows PC 上导致出现此类问题,尤其是带有 Intel 显卡的。我采用的解决方案是在为Windows编译时强制使用ANGLE。这已经非常成功,除了几台 PC,它们显示空白 window(通常是白色)并且如果您离开并切换回应用程序则无法重绘。
下面是一个演示问题的简短测试应用程序。当 运行 正确时,为了确认使用 ANGLE,它应该显示一个带有绿色背景和圆形白色鼠标光标的 window。如果未使用 ANGLE,那么您将获得红色背景和鼠标光标(例如 MacOS)。你永远不应该得到一个空白 window.
一台有问题的 PC 是 运行 Windows 7 32 位家庭高级版 SP1 并且具有 Intel 图形媒体加速器 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"
}
}
首先确保安装了Intel最新的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) and QT_ANGLE_PLATFORM
environment variables (see Qt5 Documentation)。
- 检查有问题的 GPU 是否为 blacklisted by Qt。它可能被列入 ANGLE and/or OpenGL 后端的黑名单。设备 ID 和驱动程序版本可以通过使用
qtdiag
和启用的 qpa 日志记录(见上文)获得。
我的 Qt Quick 2 应用程序 (QML) 在某些 Windows PC 上显示空白 window。有什么办法可以解决这个问题吗?
我知道 Qt Quick 2 需要使用 OpenGL 2.0 在某些 Windows PC 上导致出现此类问题,尤其是带有 Intel 显卡的。我采用的解决方案是在为Windows编译时强制使用ANGLE。这已经非常成功,除了几台 PC,它们显示空白 window(通常是白色)并且如果您离开并切换回应用程序则无法重绘。
下面是一个演示问题的简短测试应用程序。当 运行 正确时,为了确认使用 ANGLE,它应该显示一个带有绿色背景和圆形白色鼠标光标的 window。如果未使用 ANGLE,那么您将获得红色背景和鼠标光标(例如 MacOS)。你永远不应该得到一个空白 window.
一台有问题的 PC 是 运行 Windows 7 32 位家庭高级版 SP1 并且具有 Intel 图形媒体加速器 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"
}
}
首先确保安装了Intel最新的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) andQT_ANGLE_PLATFORM
environment variables (see Qt5 Documentation)。 - 检查有问题的 GPU 是否为 blacklisted by Qt。它可能被列入 ANGLE and/or OpenGL 后端的黑名单。设备 ID 和驱动程序版本可以通过使用
qtdiag
和启用的 qpa 日志记录(见上文)获得。