在Win 7

时间:2017-01-03 19:38:17

标签: windows qt opengl-es qtquick2

我有一个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"
    }
}

1 个答案:

答案 0 :(得分:1)

首先确保安装了最新的Intel驱动程序。 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后端的黑名单。可以使用qtdiag启用qpa日志记录获取设备ID和驱动程序版本(参见上文)。