在Win 7上使用Qt和ANGLE时的空白窗口

我有一个Qt Quick 2应用程序(QML),在某些Windows电脑上显示一个空白窗口。 任何想法如何治愈?

我知道Qt Quick 2使用OpenGL 2.0的需求在一些Windows PC上,尤其是那些带有Intelgraphics卡的Windows PC上引起了这样的问题。 我采用的解决scheme是强制使用ANGLE编译Windows时。 这是非常成功的,除了几台电脑,它显示一个空白的窗口(通常是白色),如果你切换回切换到应用程序,则无法重新绘制。

下面是一个简短的testing应用程序,演示这个问题。 当正确运行时,要确认使用ANGLE,它应该显示一个带有绿色背景的窗口和一个圆形的白色鼠标光标。 如果ANGLE没有被使用,那么你会得到一个红色的背景和鼠标光标(例如MacOS)。 你永远不应该得到一个空白的窗口。

一台出现问题的PC运行Windows 7 32位家庭高级版SP1,并具有英特尔graphics媒体加速器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使用角度。 另外,您可以通过设置QT_LOGGING_RULES=qt.qpa.gl=true环境变量来启用Qt平台抽象(qpa)日志记录,这将记录关于渲染后端的相当多的有用信息。

这里有几件事你可以尝试:

  • 确保部署所需的dll文件: libGLESv2.dlld3dcompiler47.dll (最新可用的Windows SDK), libEGL.dllopengl32sw.dll (用于软件渲染)。 最简单的方法就是使用windeployqt
  • 使用qtdiag二进制来确定后端Qt使用的渲染(当不强制转为ANGLE时)。
  • QT_OPENGL (参见Qt5文档 )和QT_ANGLE_PLATFORM环境变量(参见Qt5文档 )。
  • 检查所讨论的GPU是否被Qt列入黑名单 。 它可能被列入ANGLE和/或OpenGL后端的黑名单。 设备ID和驱动程序版本可以通过使用qtdiag来启用qpa日志记录(参见上文)。