我有一个Qt Quick 2应用程序(QML),它在某些Windows PC上显示一个空白窗口。任何想法如何治愈这个?
我知道Qt Quick 2使用OpenGL 2.0需要在某些Windows PC上引起类似问题,特别是那些使用Intel显卡的PC。我采用的解决方案是在编译Windows时强制使用ANGLE。这是非常成功的,除了几台PC,它们显示一个空白窗口(通常是白色),如果你切换并切换回应用程序,则无法重绘。
以下是一个简短的测试应用程序,用于演示此问题。当正确运行时,为了确认使用ANGLE,它应该显示一个带有绿色背景和圆形白色鼠标光标的窗口。如果ANGLE未使用,那么您将获得红色背景和鼠标光标(例如MacOS)。你永远不应该得到一个空白的窗口。
一台有问题的电脑正在运行Windows 7 32位家庭高级版SP1,并配有英特尔图形媒体加速器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"
}
}
答案 0 :(得分:1)
首先确保安装了最新的Intel驱动程序。 GPU已经很老了,所以可能由于驱动程序错误而无法使用ANGLE。在这种情况下,Qt可以检测到这一点并切换到软件渲染,但前提是不强制Qt使用ANGLE。此外,您可以通过设置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 Documentation)和QT_ANGLE_PLATFORM
环境变量进行试验(请参阅Qt5 Documentation)。qtdiag
启用qpa日志记录获取设备ID和驱动程序版本(参见上文)。