Auf dieser Seite

Qt für Windows – Grafikbeschleunigung

Damit Qt Quick funktioniert, ist ein Grafiktreiber erforderlich, der Direct3D 11, Direct3D 12, Vulkan 1.0 oder OpenGL 2.1 oder höher unterstützt. Ab Qt 6 ist die Standardeinstellung für „ Qt Quick “ unter Windows Direct3D 11. Dies unterscheidet sich von Qt 5, wo die Standardeinstellung OpenGL war – entweder direkt oder über ANGLE, einen OpenGL-zu-Direct3D-Konverter. ANGLE wird in Qt 6 nicht mehr mitgeliefert.

Um die Verwendung des Direct3D-Software-Rasterisierers (WARP) zu erzwingen, setzen Sie die Umgebungsvariable „ QSG_RHI_PREFER_SOFTWARE_RENDERER “ auf „ 1 “. In einigen Fällen führt „ Qt Quick “ einen solchen Fallback automatisch durch, um die Ausführung von Qt-Anwendungen ohne zusätzliche Konfiguration zu ermöglichen. Dies geschieht, wenn die Treiber keine ausreichende D3D11-Funktionalität bereitstellen, und tritt typischerweise in virtuellen Maschinen auf, in denen keine ordnungsgemäße GPU-Beschleunigung und kein Passthrough implementiert sind. Wenn Sie sich nicht sicher sind, welches Grafikgerät verwendet wird, oder wenn Sie Fehler beheben oder Probleme an Qt XML melden möchten, führen Sie die Anwendung mit der gesetzten Umgebungsvariablen „ QSG_INFO=1 “ aus und überprüfen Sie die Debug-Ausgabe. Die Ausführung des Tools „ qtdiag “ kann ebenfalls nützliche Informationen liefern, da es alle verfügbaren 3D-APIs auflistet.

Um die Verwendung von Vulkan, OpenGL oder Direct 3D 12 anzufordern, setzen Sie die Umgebungsvariable „ QSG_RHI_BACKEND “ auf „ vulkan “, „ opengl “ oder „ d3d12 “ oder verwenden Sie das entsprechende „ C++ API “ unter „ main() “. Beachten Sie, dass für einige dieser 3D-APIs möglicherweise die entsprechenden Treiber installiert sein müssen.

Obwohl es nicht die Standardeinstellung für Qt Quick, wird OpenGL dennoch häufig in vielen Qt-Anwendungen verwendet, beispielsweise in auf QWidget basierenden Anwendungen, die auf QOpenGLWindow oder QOpenGLWidget aufbauen. Die folgenden Abschnitte behandeln einige OpenGL-spezifische Aspekte eines Qt-Builds.

Dynamisches Laden von OpenGL

Qt unterstützt die Auswahl und das Laden der OpenGL-Implementierung zur Laufzeit. Dieser Modus ist der Standard und kann explizit angefordert werden, indem -opengl dynamic an das Konfigurationsskript übergeben wird.

configure -opengl dynamic

Diese Konfiguration ist am flexibelsten, da während der Kompilierung keine Abhängigkeiten oder Annahmen bezüglich der OpenGL-Implementierung fest codiert werden. Sie ermöglicht eine robuste Anwendungsbereitstellung. Wenn eine bestimmte Umgebung keine geeignete OpenGL-2.0-Implementierung bereitstellt, wird automatisch auf eine Alternative zu ` opengl32.dll` zurückgegriffen, deren Standardname ` opengl32sw.dll` lautet. Die vorgefertigten Qt-Pakete enthalten unter diesem Namen eine Version von Mesa llvmpipe, einer Software-Rasterizer-Implementierung von OpenGL.

Bei einer Konfiguration mit „ -opengl dynamic “ werden weder Qt noch die mit „ qmake “ oder „ CMake “ erstellten Anwendungen mit „opengl32.lib“ verknüpft. Stattdessen wird die Bibliothek zur Laufzeit ausgewählt und geladen. Standardmäßig ermittelt Qt, ob die systemeigene opengl32.dll OpenGL-2-Funktionen bereitstellt. Sind diese vorhanden, wird opengl32.dll verwendet, andernfalls wird versucht, „ opengl32sw.dll “ zu laden. Details dazu finden Sie weiter unten.

Der Lademechanismus kann über die Umgebungsvariable „ QT_OPENGL “ und die folgenden Anwendungsattribute konfiguriert werden:

  • Qt::AA_UseDesktopOpenGL Entspricht der Einstellung von ` QT_OPENGL ` auf ` desktop`.
  • Qt::AA_UseOpenGLES Hat in Qt 6 keine Auswirkung.
  • Qt::AA_UseSoftwareOpenGL Entspricht der Einstellung von ` QT_OPENGL ` auf ` software`.

Wenn eine bestimmte Konfiguration explizit angefordert wird, werden beim Start der Anwendung keine Prüfungen durchgeführt, d. h., die vom System bereitgestellte opengl32.dll wird nicht überprüft.

Das dynamische Laden hat erhebliche Auswirkungen auf Anwendungen, die native OpenGL-Aufrufe enthalten: Sie können beim Verknüpfen fehlschlagen, da opengl32.lib dem Linker nicht automatisch angegeben wird. Stattdessen wird erwartet, dass Anwendungen die OpenGL-Funktionen über die Klasse „ QOpenGLFunctions “ nutzen. Dadurch wird die direkte Abhängigkeit von der OpenGL-Bibliothek beseitigt, und alle Aufrufe werden zur Laufzeit an die von Qt gewählte Implementierung weitergeleitet. Alternativ steht es Anwendungen frei, direkte OpenGL-Funktionsaufrufe zu verwenden, wenn sie opengl32.lib zu ihren .pro-Projektdateien hinzufügen: LIBS += opengl32.lib (Visual Studio) oder LIBS += -lopengl32 (Mingw-w64). Das Ergebnis entspricht aus Sicht der Anwendung der Qt-Build-Konfiguration „ -opengl desktop “.

Qt::AA_UseSoftwareOpenGL ist insofern besonders, als es versucht, eine OpenGL-Implementierung mit einem nicht standardmäßigen Namen zu laden. Der Standardname lautet „ opengl32sw.dll “. Dies ermöglicht es, eine rein softwarebasierte OpenGL-Implementierung – beispielsweise einen Mesa-Build mit llvmpipe – unter diesem Namen bereitzustellen. Bei Bedarf kann der Dateiname durch Setzen der Umgebungsvariable „ QT_OPENGL_DLL “ überschrieben werden.

Es ist möglich, eine Konfigurationsdatei im JSON-Format bereitzustellen, in der je nach Grafikkarte und Treiberversion festgelegt wird, welche OpenGL-Implementierung verwendet werden soll. Der Speicherort wird durch die Umgebungsvariable ` QT_OPENGL_BUGLIST` angegeben. Relative Pfade werden mithilfe von ` QLibraryInfo::SettingsPath ` oder ` QStandardPaths::ConfigLocation` aufgelöst. Die Datei verwendet das Format der Treiber-Fehlerliste, die in den Chromium-Projekten verwendet wird. Sie besteht aus einer Liste von Einträgen, von denen jeder eine Reihe von Bedingungen sowie eine Liste von Funktionsschlüsselwörtern angibt. In der Regel werden die Geräte-ID und die Hersteller-ID verwendet, um eine bestimmte Grafikkarte zu identifizieren. Diese finden sich in der Ausgabe des Tools „ qtdiag6 “ oder „ dxdiag “.

Die folgenden Funktionsschlüsselwörter sind für die Auswahl der OpenGL-Implementierung relevant:

Hinweis: In Qt 6 werden die veralteten ANGLE-bezogenen Schlüsselwörter (disable_angle, disable_d3d11, disable_d3d9) zwar akzeptiert, haben jedoch keine Wirkung.

  • disable_desktopgl - Deaktiviert OpenGL. Dadurch wird sichergestellt, dass Qt nicht versucht, reguläres OpenGL (opengl32.dll) zu verwenden, und dass es sofort mit ANGLE startet. Dies ist nützlich, um zu verhindern, dass fehlerhafte OpenGL-Treiber die Anwendung zum Absturz bringen.
  • disable_rotation - Erzwingt, dass die Anwendung stets im Querformat ausgeführt wird. Bei Verwendung einer Software-OpenGL-Implementierung hat dies keine Auswirkung. Diese Option ist für Treiber vorgesehen, bei denen Probleme mit der Drehung auftreten.
  • disable_program_cache - Deaktiviert das Speichern von Shader-Programm-Binärdateien auf der Festplatte.

Eine Beispieldatei sieht wie folgt aus:

{
"entries": [
{
  "id": 1,
  "description": "Disable D3D11 on older nVidia drivers",
  "os": {
    "type": "win"
  },
  "vendor_id": "0x10de",
  "device_id": ["0x0DE9"],
  "driver_version": {
    "op": "<=",
    "value": "8.17.12.6973"
  },
  "features": [
    "disable_d3d11"
  ]
},
...

Wenn „ QT_OPENGL_BUGLIST “ nicht angegeben ist, wird eine integrierte Liste verwendet. Diese umfasst in der Regel einige ältere, weniger leistungsfähige Grafikkarten, bei denen „ disable_desktopgl “ gesetzt ist, um zu verhindern, dass Qt deren instabile Desktop-OpenGL-Implementierungen verwendet, und stattdessen sofort auf den Versuch zurückgreift, die softwarebasierte alternative Bibliothek zu laden.

In der Praxis sind voraussichtlich die folgenden Kombinationen am häufigsten anzutreffen:

  • disable_desktopgl - Falls das System OpenGL 2.0 oder neuer bereitstellt, der Treiber jedoch bekanntermaßen instabil und absturzanfällig ist.
  • disable_desktopgl, disable_angle – Wenn kein beschleunigter Pfad gewünscht ist. Dies stellt sicher, dass Qt ausschließlich den Software-Rasterizer (opengl32sw.dll) verwendet. Kann in virtuellen Maschinen und Anwendungen nützlich sein, die auf einer Vielzahl älterer Systeme eingesetzt werden.

Die unterstützten Schlüssel für die Zuordnung zu einer bestimmten Grafikkarte oder einem bestimmten Treiber sind die folgenden. Beachten Sie, dass einige davon Qt-spezifisch sind.

  • os.type - Betriebssystem: win, linux, macosx, android
  • os.version - Kernel-Version
  • os.release - Gibt eine Liste von Betriebssystemversionen unter Windows an: xp, vista, 7, 8, 8.1, 10.
  • vendor_id - Hersteller anhand der Adapter-ID
  • device_id - Liste der PCI-Geräte-IDs.
  • driver_version - Treiberversion aus der Adapterkennung
  • driver_description - Stimmt überein, wenn der Wert eine Teilzeichenfolge der Treiberbeschreibung aus der Adapterkennung ist
  • gl_vendor - Es liegt eine Übereinstimmung vor, wenn der Wert eine Teilzeichenfolge der Zeichenkette „ GL_VENDOR “ ist

Um alle Sperrlisten zu deaktivieren, setzen Sie die Umgebungsvariable „ QT_NO_OPENGL_BUGLIST “ auf einen beliebigen Wert. Dadurch wird das Einlesen von Konfigurationsdateien übersprungen und stattdessen davon ausgegangen, dass nichts deaktiviert ist, unabhängig vom Treiber oder Betriebssystem.

Hinweis: Obwohl dies in der Regel nicht erforderlich ist, kann „ QT_NO_OPENGL_BUGLIST “ in bestimmten virtuellen Umgebungen relevant werden, in denen mehrere, möglicherweise virtuelle, Grafikadapter vorhanden sind. Wenn die Protokolle aus Kategorien wie „ qt.qpa.gl “ darauf hindeuten, dass die Erkennung des Treibers und des Grafikadapters zu einer fälschlichen Deaktivierung von OpenGL führt, wird empfohlen, diese Umgebungsvariable zu setzen, damit die Anwendung normal ausgeführt werden kann. Diese Umgebungsvariable wurde in Qt 5.15 eingeführt.

Direkte Abhängigkeit von opengl32.dll

Eine Alternative zu den standardmäßigen OpenGL-Builds mit „ dynamic “ ist die direkte Abhängigkeit von „opengl32.dll“. Für diesen Modus übergeben Sie die Befehlszeilenoptionen „ -opengl desktop “ an das „configure“-Skript.

configure -opengl desktop

Hinweis: Die Verwendung von EGL und OpenGL ES wird unter Windows nicht unterstützt. In Qt 6 setzt OpenGL unter Windows immer die Verwendung von WGL als Schnittstelle zum Fenstersystem voraus.

In solchen Qt-Builds sind viele Qt-Shared-Libraries sowie Qt-Anwendungen von der opengl32.dll abhängig, weshalb die Verwendung einer alternativen Bibliothek nicht möglich ist.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.