2017-01-03 19 views
1

特定のWindows PCで空白のウィンドウを表示しているQt Quick 2アプリ(QML)があります。どのようにこれを治すためのアイデアですか?Windows 7のANGLEでQtを使用した場合の空白ウィンドウ

Qt Quick 2がOpenGL 2.0を使用する必要があるため、一部のWindows PC、特にIntelグラフィックスカードを搭載したPCでこのような問題が発生しています。私が採用した解決策は、Windows用にコンパイルするときにANGLEを強制的に使用することです。空白のウィンドウ(通常は白)を表示し、離れた場所に移動してアプリケーションに戻ると再描画に失敗する2台のPCを除いて、これは非常に成功しています。

以下は、この問題を示す短いテストアプリです。 ANGLEの使用を確認するには、正常に動作しているときは、緑色の背景と円形の白色マウスカーソルが表示されます。 ANGLEが使用されていない場合、赤い背景とマウスカーソル(MacOSなど)が表示されます。あなたは決して空白の窓を得るべきではありません。

問題が発生したPCは、Windows 7 32ビットHome Premium SP1を実行していて、Intel Graphics Media Accelerator 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

まずIntelの最新のGPUドライバがインストールされていることを確認してください。 GPUはかなり古いので、おそらく欠陥のあるドライバのためにANGLEで作業していないだけかもしれません。この場合、Qtはこれを検出してソフトウェアレンダリングに切り替えることができますが、がない場合は、にQtを使用してANGLEを使用するようにしてください。また、QT_LOGGING_RULES=qt.qpa.gl=true環境変数を設定することで、Qtプラットフォームの抽象化(qpa)ログを有効にすることができます。これにより、レンダリングバックエンドに関するかなりの情報がログに記録されます。 (ソフトウェアレンダリング用)libGLESv2.dlld3dcompiler47.dll(WindowsのSDKから入手できる最新)、libEGL.dllともopengl32sw.dll:必要なDLLファイルを展開することを確認します

  • :ここ

    はあなたが試すことができますがいくつかあります。これを行うには、windeployqtを使用するのが最も簡単な方法です。

  • qtdiagバイナリを使用して、Qtが使用するレンダリングバックエンド(ANGLEに強制されていない場合)を特定します。
  • QT_OPENGLQt5 Documentation参照)とQT_ANGLE_PLATFORMの環境変数(Qt5 Documentationを参照)を試してください。
  • 問題のGPUがblacklisted by Qtであることを確認してください。 ANGLEおよび/またはOpenGLバックエンドに対してブラックリストに登録されている可能性があります。デバイスIDとドライバのバージョンは、有効なqpaロギングを使用してqtdiagを使用して取得できます(上記参照)。
+0

GPUがANGLEで動作していない可能性があります。私はいくつかのGPUがネイティブ/デスクトップで動作しないことを知っていますが、ANGLEに問題があるかもしれないことを認識していませんでした。 私はqpa-doを有効にしようとします。main.cppのQProcessEnvironmentを使って環境変数を設定するか、.proで実行できますか? –

+0

実行可能ファイルを実行する前に、またはQt Creatorの 'run'設定を介して、cmdプロンプト(' set QT_LOGGING_RULES = qt.qpa.gl = true')でグローバルに(コントロールパネル - >システム)残念ながら、QProcessEnvironmentやその他のプログラムによる方法を使用することは遅すぎます。 – Mathias

+0

ありがとうございます。ちょうど問題のあるPCで再テストする機会がありました。私はすでにそれが最新のドライバを持っていることを確認していたので、今回はOpenGLソフトウェアのレンダリングをテストしましたが、これで問題が分類されました。甘い。 –

関連する問題