我有一个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)日志记录,这将记录关于渲染后端的相当多的有用信息。
这里有几件事你可以尝试:
libGLESv2.dll
, d3dcompiler47.dll
(最新可用的Windows SDK), libEGL.dll
和opengl32sw.dll
(用于软件渲染)。 最简单的方法就是使用windeployqt
。 qtdiag
二进制来确定后端Qt使用的渲染(当不强制转为ANGLE时)。 QT_OPENGL
(参见Qt5文档 )和QT_ANGLE_PLATFORM
环境变量(参见Qt5文档 )。 qtdiag
来启用qpa日志记录(参见上文)。