在 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.dlld3dcompiler47.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 日志记录(见上文)获得。