在 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

ma​​in.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.dlld3dcompiler47.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 QML:限制最大FPS

Qt 是不是使用 opengl=angle 修复支持不支持 opengl 2.0 的 Windows 客户端?

winqt5打包qt程序打包成一个可执行文件(带图标任何win都可以运行哦)

带Qt的ComCtl32.dll版本6

Win7+VS2005编译Qt4.7.3+phonon(需要安装新版本Windows SDK)