QOpenGLDebugLogger Class

Der QOpenGLDebugLogger ermöglicht die Protokollierung von OpenGL-Debugging-Meldungen. Mehr...

Kopfzeile: #include <QOpenGLDebugLogger>
CMake: find_package(Qt6 REQUIRED COMPONENTS OpenGL)
target_link_libraries(mytarget PRIVATE Qt6::OpenGL)
qmake: QT += opengl
Vererbt: QObject

Öffentliche Typen

enum LoggingMode { AsynchronousLogging, SynchronousLogging }

Eigenschaften

Öffentliche Funktionen

QOpenGLDebugLogger(QObject *parent = nullptr)
virtual ~QOpenGLDebugLogger()
void disableMessages(QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource, QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType, QOpenGLDebugMessage::Severities severities = QOpenGLDebugMessage::AnySeverity)
void disableMessages(const QList<GLuint> &ids, QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource, QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType)
void enableMessages(QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource, QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType, QOpenGLDebugMessage::Severities severities = QOpenGLDebugMessage::AnySeverity)
void enableMessages(const QList<GLuint> &ids, QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource, QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType)
bool initialize()
bool isLogging() const
QList<QOpenGLDebugMessage> loggedMessages() const
QOpenGLDebugLogger::LoggingMode loggingMode() const
qint64 maximumMessageLength() const
void popGroup()
void pushGroup(const QString &name, GLuint id = 0, QOpenGLDebugMessage::Source source = QOpenGLDebugMessage::ApplicationSource)

Öffentliche Slots

void logMessage(const QOpenGLDebugMessage &debugMessage)
void startLogging(QOpenGLDebugLogger::LoggingMode loggingMode = AsynchronousLogging)
void stopLogging()

Signale

void messageLogged(const QOpenGLDebugMessage &debugMessage)

Detaillierte Beschreibung

Einführung

Die OpenGL-Programmierung kann sehr fehleranfällig sein. Meistens kann ein einziger fehlerhafter Aufruf von OpenGL dazu führen, dass ein ganzer Teil einer Anwendung nicht mehr funktioniert und nichts auf dem Bildschirm gezeichnet wird.

Die einzige Möglichkeit, sicher zu sein, dass die OpenGL-Implementierung keine Fehler zurückgibt, ist die Überprüfung mit glGetError nach jedem einzelnen API-Aufruf. Außerdem stapeln sich OpenGL-Fehler, daher sollte glGetError immer in einer Schleife wie dieser verwendet werden:

GLenum error = GL_NO_ERROR;
do {
    error = glGetError();
    if (error != GL_NO_ERROR) {
        // handle the error
    }
} while (error != GL_NO_ERROR);

Wenn Sie versuchen, den Fehlerstapel zu leeren, stellen Sie sicher, dass Sie nicht nur weitermachen, bis GL_NO_ERROR zurückgegeben wird, sondern auch bei GL_CONTEXT_LOST abbrechen, da dieser Fehlerwert immer wieder auftauchen wird.

Es gibt auch viele andere Informationen, an denen wir (als Anwendungsentwickler) interessiert sind, zum Beispiel Leistungsprobleme oder Warnungen über die Verwendung veralteter APIs. Diese Art von Meldungen werden nicht durch die normalen OpenGL-Fehlerberichtsmechanismen gemeldet.

QOpenGLDebugLogger zielt darauf ab, diese Probleme zu adressieren, indem es Zugriff auf das OpenGL-Debug-Log bietet. Wenn Ihre OpenGL-Implementierung dies unterstützt (indem Sie die GL_KHR_debug -Erweiterung zur Verfügung stellen), werden Meldungen vom OpenGL-Server entweder in einem internen OpenGL-Protokoll protokolliert oder in "Echtzeit" an Listener weitergegeben, wenn sie von OpenGL erzeugt werden.

QOpenGLDebugLogger unterstützt diese beiden Betriebsarten. Lesen Sie die folgenden Abschnitte, um die Unterschiede zwischen ihnen herauszufinden.

Erstellen eines OpenGL-Debug-Kontextes

Aus Effizienzgründen ist es OpenGL-Implementierungen erlaubt, überhaupt keine Debug-Ausgabe zu erzeugen, es sei denn, der OpenGL-Kontext ist ein Debug-Kontext. Um einen Debug-Kontext von Qt aus zu erstellen, müssen Sie die QSurfaceFormat::DebugContext Format-Option auf der QSurfaceFormat setzen, die zum Erstellen des QOpenGLContext Objekts verwendet wird:

QSurfaceFormat format;
// asks for a OpenGL 3.2 debug context using the Core profile
format.setMajorVersion(3);
format.setMinorVersion(2);
format.setProfile(QSurfaceFormat::CoreProfile);
format.setOption(QSurfaceFormat::DebugContext);

QOpenGLContext *context = new QOpenGLContext;
context->setFormat(format);
context->create();

Beachten Sie, dass die Anforderung eines 3.2 OpenGL Core Profils nur für die Zwecke des Beispiels ist; diese Klasse ist nicht an eine bestimmte OpenGL oder OpenGL ES Version gebunden, da sie von der Verfügbarkeit der GL_KHR_debug Erweiterung abhängt (siehe unten).

Erstellen und Initialisieren eines QOpenGLDebugLogger

QOpenGLDebugLogger ist eine einfache QObject-abgeleitete Klasse. Genau wie alle QObject Unterklassen erstellen Sie eine Instanz (und geben optional ein übergeordnetes Objekt an), und wie die anderen OpenGL-Funktionen in Qt müssen Sie sie vor der Verwendung initialisieren, indem Sie initialize() aufrufen, während es einen aktuellen OpenGL-Kontext gibt:

QOpenGLContext *ctx = QOpenGLContext::currentContext();
QOpenGLDebugLogger *logger = new QOpenGLDebugLogger(this);

logger->initialize(); // initializes in the current context, i.e. ctx

Beachten Sie, dass die Erweiterung GL_KHR_debug im Kontext verfügbar sein muss, um auf die von OpenGL protokollierten Meldungen zugreifen zu können. Sie können das Vorhandensein dieser Erweiterung überprüfen, indem Sie aufrufen:

ctx->hasExtension(QByteArrayLiteral("GL_KHR_debug"));

wobei ctx eine gültige QOpenGLContext ist. Wenn die Erweiterung nicht verfügbar ist, gibt initialize() false zurück.

Lesen des internen OpenGL-Debug-Protokolls

OpenGL-Implementierungen führen ein internes Protokoll mit Debug-Meldungen. Meldungen, die in diesem Protokoll gespeichert sind, können mit der Funktion loggedMessages() abgerufen werden:

const QList<QOpenGLDebugMessage> messages =  logger->loggedMessages();for(const QOpenGLDebugMessage &message: messages)    qDebug() << message;

Das interne Protokoll hat eine begrenzte Größe; wenn es voll ist, werden ältere Meldungen verworfen, um Platz für die neu eingehenden Meldungen zu schaffen. Wenn Sie loggedMessages() aufrufen, wird auch das interne Protokoll geleert.

Wenn Sie sichergehen wollen, dass keine Debug-Meldungen verloren gehen, müssen Sie die Echtzeit-Protokollierung verwenden, anstatt diese Funktion aufzurufen. In der Zeitspanne zwischen der Kontexterzeugung und der Aktivierung der Echtzeitprotokollierung (oder generell, wenn die Echtzeitprotokollierung deaktiviert ist) können jedoch immer noch Debugmeldungen erzeugt werden.

Echtzeit-Protokollierung von Meldungen

Es ist auch möglich, einen Strom von Debug-Meldungen vom OpenGL-Server zu empfangen , während sie von der Implementierung erzeugt werden. Dazu müssen Sie einen geeigneten Slot mit dem Signal messageLogged() verbinden und die Protokollierung durch den Aufruf von startLogging() starten:

connect(logger, &QOpenGLDebugLogger::messageLogged, receiver, &LogHandler::handleLoggedMessage);
logger->startLogging();

Ebenso kann die Protokollierung jederzeit durch Aufruf der Funktion stopLogging() deaktiviert werden.

Die Echtzeit-Protokollierung kann entweder asynchron oder synchron erfolgen, je nach dem Parameter, der an startLogging() übergeben wird. Wenn die Protokollierung im asynchronen Modus erfolgt (die Standardeinstellung, da sie einen sehr geringen Overhead hat), kann die OpenGL-Implementierung jederzeit Nachrichten erzeugen und/oder in einer Reihenfolge, die von der Reihenfolge der OpenGL-Befehle abweicht, die die Protokollierung dieser Nachrichten verursacht haben. Die Meldungen könnten auch von einem anderen Thread als dem, an den der Kontext gerade gebunden ist, erzeugt werden. Dies liegt daran, dass OpenGL-Implementierungen in der Regel stark threaded und asynchron sind, und daher keine Garantien über die relative Reihenfolge und die Zeitpunkte der Debug-Meldungen gegeben werden.

Auf der anderen Seite hat die Protokollierung im synchronen Modus einen hohen Overhead, aber die OpenGL-Implementierung garantiert, dass alle Nachrichten, die durch einen bestimmten Befehl ausgelöst werden, in der Reihenfolge empfangen werden, bevor der Befehl zurückkehrt, und von demselben Thread, an den der OpenGL-Kontext gebunden ist.

Das bedeutet, dass Sie, wenn Sie im synchronen Modus protokollieren, in der Lage sein werden, Ihre OpenGL-Anwendung in einem Debugger laufen zu lassen, einen Haltepunkt auf einem Slot zu setzen, der mit dem messageLogged()-Signal verbunden ist, und in der Rückverfolgung den genauen Aufruf zu sehen, der die protokollierte Nachricht verursacht hat. Dies kann sehr nützlich sein, um ein OpenGL-Problem zu beheben. Beachten Sie, dass Sie, wenn das OpenGL-Rendering in einem anderen Thread stattfindet, den Signal/Slot-Verbindungstyp auf Qt::DirectConnection erzwingen müssen, um den tatsächlichen Backtrace sehen zu können.

Weitere Informationen über die Protokollierungsmodi finden Sie in der LoggingMode enum-Dokumentation.

Hinweis: Wenn die Echtzeit-Protokollierung aktiviert ist, werden Debug-Meldungen nicht mehr in das interne OpenGL-Debug-Protokoll eingefügt; Meldungen, die bereits im internen Protokoll vorhanden sind, werden nicht gelöscht, noch werden sie durch das messageLogged() Signal ausgegeben. Da einige Nachrichten generiert werden können, bevor die Echtzeit-Protokollierung gestartet wird (und daher im internen OpenGL-Protokoll verbleiben), ist es wichtig, nach dem Aufruf von startLogging() immer zu überprüfen, ob es eine Nachricht enthält.

Einfügen von Meldungen in das Debug-Protokoll

Es ist für Anwendungen und Bibliotheken möglich, benutzerdefinierte Meldungen in das Debug-Protokoll einzufügen, z.B. um eine Gruppe von zusammenhängenden OpenGL-Befehlen zu markieren und somit in der Lage zu sein, eventuelle Meldungen, die von ihnen kommen, zu identifizieren.

Um dies zu tun, können Sie ein QOpenGLDebugMessage Objekt durch Aufruf von createApplicationMessage() oder createThirdPartyMessage() erstellen und es dann durch Aufruf von logMessage() in das Protokoll einfügen:

QOpenGLDebugMessage message =
    QOpenGLDebugMessage::createApplicationMessage(QStringLiteral("Custom message"));

logger->logMessage(message);

Beachten Sie, dass OpenGL-Implementierungen ein herstellerspezifisches Limit für die Länge der Meldungen haben, die in das Debug-Protokoll eingefügt werden können. Sie können diese Länge durch den Aufruf der Methode maximumMessageLength() abrufen; Nachrichten, die länger als das Limit sind, werden automatisch abgeschnitten.

Kontrolle der Debug-Ausgabe

QOpenGLDebugMessage kann auch Filter auf die Debug-Meldungen anwenden und so die Menge der protokollierten Meldungen begrenzen. Sie können die Protokollierung von Nachrichten aktivieren oder deaktivieren, indem Sie enableMessages() bzw. disableMessages() aufrufen. Standardmäßig werden alle Meldungen protokolliert.

Es ist möglich, Meldungen zu aktivieren oder zu deaktivieren, indem man sie auswählt nach:

  • Quelle, Typ und Schweregrad (und einschließlich aller IDs in der Auswahl);
  • id, Quelle und Typ (und einschließlich aller Schweregrade in der Auswahl).

Beachten Sie, dass der Status "aktiviert" für eine bestimmte Meldung eine Eigenschaft des Tupels (id, source, type, severity) ist; die Meldungsattribute bilden keine Hierarchie irgendeiner Art. Sie sollten auf die Reihenfolge der Aufrufe von enableMessages() und disableMessages() achten, da sich dadurch ändert, welche Nachrichten aktiviert/deaktiviert werden.

Es ist nicht möglich, nach dem Nachrichtentext selbst zu filtern; die Anwendungen müssen dies selbst tun (in Slots, die mit dem Signal messageLogged() verbunden sind, oder nach dem Abrufen der Nachrichten im internen Debug-Protokoll durch loggedMessages()).

Um die Verwaltung der aktivierten/deaktivierten Zustände zu vereinfachen, unterstützt QOpenGLDebugMessage auch das Konzept von debug groups. Eine Debug-Gruppe enthält die Gruppe der aktivierten/deaktivierten Konfigurationen von Debug-Meldungen. Darüber hinaus sind Debug-Gruppen in einem Stapel organisiert: es ist möglich, Gruppen durch den Aufruf von pushGroup() und popGroup() zu verschieben bzw. zu entfernen. (Wenn ein OpenGL-Kontext erstellt wird, befindet sich bereits eine Gruppe im Stapel).

Die Funktionen enableMessages() und disableMessages() ändern die Konfiguration der aktuellen Debug-Gruppe, d.h. der Gruppe, die sich oben auf dem Stapel der Debug-Gruppen befindet.

Wenn eine neue Gruppe auf den Stapel der Debug-Gruppen geschoben wird, erbt sie die Konfiguration der Gruppe, die sich zuvor an der Spitze des Stapels befand. Umgekehrt wird durch das Entfernen einer Debug-Gruppe die Konfiguration der Debug-Gruppe wiederhergestellt, die nun an der Spitze steht.

Das Verschieben (bzw. Herausnehmen) von Debug-Gruppen erzeugt auch automatisch eine Debug-Meldung vom Typ QOpenGLDebugMessage::GroupPushType (bzw. GroupPopType).

Siehe auch QOpenGLDebugMessage.

Dokumentation der Mitgliedstypen

enum QOpenGLDebugLogger::LoggingMode

Das LoggingMode-Enum definiert den Logging-Modus des Logger-Objekts.

KonstanteWertBeschreibung
QOpenGLDebugLogger::AsynchronousLogging0Nachrichten vom OpenGL-Server werden asynchron protokolliert. Das bedeutet, dass Nachrichten einige Zeit nach den entsprechenden OpenGL-Aktionen, die sie verursacht haben, protokolliert werden können, und sogar in einer ungeordneten Weise empfangen werden können, abhängig von der OpenGL-Implementierung. Dieser Modus hat eine sehr geringe Leistungseinbuße, da OpenGL-Implementierungen von Natur aus stark threaded und asynchron sind.
QOpenGLDebugLogger::SynchronousLogging1Nachrichten vom OpenGL-Server werden synchron und sequentiell protokolliert. Dies hat einen starken Leistungseinbruch zur Folge, da OpenGL-Implementierungen von Natur aus sehr asynchron sind; aber es ist sehr nützlich, um OpenGL-Probleme zu debuggen, da OpenGL garantiert, dass die von einem OpenGL-Befehl erzeugten Nachrichten protokolliert werden, bevor die entsprechende Befehlsausführung zurückgekehrt ist. Daher können Sie einen Haltepunkt auf dem messageLogged()-Signal installieren und in der Rückverfolgung sehen, welcher OpenGL-Befehl es verursacht hat; der einzige Nachteil ist, dass Sie, wenn Sie OpenGL von mehreren Threads aus verwenden, möglicherweise eine direkte Verbindung erzwingen müssen, wenn Sie sich mit dem messageLogged()-Signal verbinden.

Dokumentation der Eigenschaft

[read-only] loggingMode : const LoggingMode

Diese Eigenschaft enthält den an startLogging() übergebenen Protokollierungsmodus.

Beachten Sie, dass die Protokollierung gestartet worden sein muss, sonst ist der Wert dieser Eigenschaft bedeutungslos.

Zugriffsfunktionen:

QOpenGLDebugLogger::LoggingMode loggingMode() const

Siehe auch startLogging() und isLogging().

Dokumentation der Mitgliedsfunktionen

[explicit] QOpenGLDebugLogger::QOpenGLDebugLogger(QObject *parent = nullptr)

Konstruiert ein neues Logger-Objekt mit der angegebenen parent.

Hinweis: Das Objekt muss initialisiert werden, bevor die Protokollierung erfolgen kann.

Siehe auch initialize().

[virtual noexcept] QOpenGLDebugLogger::~QOpenGLDebugLogger()

Zerstört das Logger-Objekt.

void QOpenGLDebugLogger::disableMessages(QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource, QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType, QOpenGLDebugMessage::Severities severities = QOpenGLDebugMessage::AnySeverity)

Deaktiviert die Protokollierung von Nachrichten mit der angegebenen sources, der angegebenen types und mit der angegebenen severities und einer beliebigen Nachrichten-ID.

Die Protokollierung wird in der aktuellen Kontrollgruppe deaktiviert.

Siehe auch enableMessages(), pushGroup(), und popGroup().

void QOpenGLDebugLogger::disableMessages(const QList<GLuint> &ids, QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource, QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType)

Deaktiviert die Protokollierung von Nachrichten mit der angegebenen ids, von der angegebenen sources und mit der angegebenen types und einem beliebigen Schweregrad.

Die Protokollierung wird in der aktuellen Kontrollgruppe deaktiviert.

Siehe auch enableMessages(), pushGroup(), und popGroup().

void QOpenGLDebugLogger::enableMessages(QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource, QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType, QOpenGLDebugMessage::Severities severities = QOpenGLDebugMessage::AnySeverity)

Aktiviert die Protokollierung von Nachrichten von der angegebenen sources, von der angegebenen types und mit der angegebenen severities und einer beliebigen Nachrichten-ID.

Die Protokollierung wird in der aktuellen Kontrollgruppe aktiviert.

Siehe auch disableMessages(), pushGroup(), und popGroup().

void QOpenGLDebugLogger::enableMessages(const QList<GLuint> &ids, QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource, QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType)

Aktiviert die Protokollierung von Nachrichten mit der angegebenen ids, von der angegebenen sources und mit der angegebenen types und einem beliebigen Schweregrad.

Die Protokollierung wird in der aktuellen Kontrollgruppe aktiviert.

Siehe auch disableMessages(), pushGroup(), und popGroup().

bool QOpenGLDebugLogger::initialize()

Initialisiert das Objekt im aktuellen OpenGL-Kontext. Der Kontext muss die Erweiterung GL_KHR_debug unterstützen, damit die Initialisierung erfolgreich ist. Das Objekt muss initialisiert werden, bevor eine Protokollierung erfolgen kann.

Es ist sicher, diese Funktion mehrmals aus demselben Kontext aufzurufen.

Diese Funktion kann auch verwendet werden, um den Kontext eines zuvor initialisierten Objekts zu ändern; beachten Sie, dass in diesem Fall das Objekt nicht protokollieren darf, wenn Sie diese Funktion aufrufen.

Gibt true zurück, wenn der Logger erfolgreich initialisiert wurde; andernfalls false.

Siehe auch QOpenGLContext.

bool QOpenGLDebugLogger::isLogging() const

Gibt true zurück, wenn dieses Objekt gerade protokolliert, andernfalls false.

Siehe auch startLogging().

[slot] void QOpenGLDebugLogger::logMessage(const QOpenGLDebugMessage &debugMessage)

Fügt die Meldung debugMessage in das OpenGL-Debug-Protokoll ein. Dies bietet eine Möglichkeit für Anwendungen oder Bibliotheken, benutzerdefinierte Meldungen einzufügen, die das Debuggen von OpenGL-Anwendungen erleichtern können.

Hinweis: debugMessage muss QOpenGLDebugMessage::ApplicationSource oder QOpenGLDebugMessage::ThirdPartySource als Quelle haben, sowie einen gültigen Typ und Schweregrad, andernfalls wird es nicht in das Protokoll eingefügt.

Hinweis: Das Objekt muss initialisiert werden, bevor eine Protokollierung erfolgen kann.

Siehe auch initialize().

QList<QOpenGLDebugMessage> QOpenGLDebugLogger::loggedMessages() const

Liest alle verfügbaren Meldungen im internen OpenGL-Debug-Protokoll und gibt sie zurück. Außerdem löscht diese Funktion das interne Debug-Protokoll, so dass nachfolgende Aufrufe keine Meldungen zurückgeben, die bereits zurückgegeben wurden.

Siehe auch startLogging().

QOpenGLDebugLogger::LoggingMode QOpenGLDebugLogger::loggingMode() const

Gibt den Protokollierungsmodus des Objekts zurück.

Hinweis: Getter-Funktion für die Eigenschaft loggingMode.

Siehe auch startLogging().

qint64 QOpenGLDebugLogger::maximumMessageLength() const

Gibt die maximal unterstützte Länge in Bytes für den Text der an logMessage() übergebenen Nachrichten zurück. Dies ist auch die maximale Länge eines Debug-Gruppennamens, da beim Schieben oder Verschieben von Gruppen automatisch eine Nachricht mit dem Debug-Gruppennamen als Nachrichtentext protokolliert wird.

Wenn ein Nachrichtentext zu lang ist, wird er automatisch von QOpenGLDebugLogger gekürzt.

Hinweis: Nachrichtentexte werden in UTF-8 kodiert, wenn sie an OpenGL übergeben werden, so dass ihre Größe in Bytes normalerweise nicht mit der Anzahl der UTF-16-Codeeinheiten übereinstimmt, wie sie z.B. von QString::length() zurückgegeben werden. (Das ist der Fall, wenn die Nachricht nur 7-Bit-ASCII-Daten enthält, was für Debug-Nachrichten typisch ist).

[signal] void QOpenGLDebugLogger::messageLogged(const QOpenGLDebugMessage &debugMessage)

Dieses Signal wird ausgegeben, wenn eine Debug-Meldung (verpackt durch das debugMessage Argument) vom OpenGL-Server aufgezeichnet wird.

Abhängig von der OpenGL-Implementierung kann dieses Signal von anderen Threads ausgegeben werden als dem/denjenigen, in dem/denen sich der/die Empfänger befinden, und sogar von einem anderen Thread als dem, in dem sich QOpenGLContext befindet, in dem dieses Objekt initialisiert wurde. Außerdem kann das Signal von mehreren Threads gleichzeitig ausgesendet werden. Dies ist normalerweise kein Problem, da Qt eine Warteschlangenverbindung für Thread-übergreifende Signalemissionen verwendet, aber wenn Sie den Verbindungstyp Direct erzwingen, dann müssen Sie sich der potentiellen Wettläufe in den mit diesem Signal verbundenen Slots bewusst sein.

Wenn die Protokollierung im Modus SynchronousLogging gestartet wurde, garantiert OpenGL, dass dieses Signal von demselben Thread ausgegeben wird, an den QOpenGLContext gebunden ist, und dass keine konkurrierenden Aufrufe stattfinden werden.

Hinweis: Die Protokollierung muss gestartet worden sein, oder dieses Signal wird nicht ausgegeben.

Siehe auch startLogging().

void QOpenGLDebugLogger::popGroup()

Entfernt die oberste Debug-Gruppe aus dem Debug-Gruppen-Stapel. Wenn die Gruppe erfolgreich entfernt wird, protokolliert OpenGL automatisch eine Nachricht mit Nachricht, ID und Quelle, die mit denen der entfernten Gruppe übereinstimmen, Typ QOpenGLDebugMessage::GroupPopType und Schweregrad QOpenGLDebugMessage::NotificationSeverity.

Das Entfernen einer Debug-Gruppe stellt die Einstellungen für die Nachrichtenfilterung der Gruppe wieder her, die an die Spitze des Debug-Gruppen-Stapels kommt.

Hinweis: Das Objekt muss vor der Verwaltung von Debug-Gruppen initialisiert werden.

Siehe auch pushGroup().

void QOpenGLDebugLogger::pushGroup(const QString &name, GLuint id = 0, QOpenGLDebugMessage::Source source = QOpenGLDebugMessage::ApplicationSource)

Schiebt eine Debug-Gruppe mit dem Namen name, der ID id und der Quelle source auf den Debug-Gruppen-Stapel. Wenn die Gruppe erfolgreich verschoben wird, protokolliert OpenGL automatisch eine Nachricht mit der Meldung name, id id, source source, type QOpenGLDebugMessage::GroupPushType und severity QOpenGLDebugMessage::NotificationSeverity.

Die neu hinzugefügte Gruppe erbt dieselben Filtereinstellungen der Gruppe, die sich oben auf dem Stapel befand; das heißt, die Filterung wird durch das Hinzufügen einer neuen Gruppe nicht verändert.

Hinweis: source muss entweder QOpenGLDebugMessage::ApplicationSource oder QOpenGLDebugMessage::ThirdPartySource sein, sonst wird die Gruppe nicht verschoben.

Hinweis: Das Objekt muss vor der Verwaltung von Debug-Gruppen initialisiert werden.

Siehe auch popGroup(), enableMessages(), und disableMessages().

[slot] void QOpenGLDebugLogger::startLogging(QOpenGLDebugLogger::LoggingMode loggingMode = AsynchronousLogging)

Startet die Protokollierung von Nachrichten, die vom OpenGL-Server kommen. Wenn eine neue Nachricht empfangen wird, wird das Signal messageLogged() ausgegeben, das die protokollierte Nachricht als Argument enthält.

loggingMode gibt an, ob die Protokollierung asynchron (die Vorgabe) oder synchron erfolgen soll.

QOpenGLDebugLogger zeichnet die Werte von GL_DEBUG_OUTPUT und GL_DEBUG_OUTPUT_SYNCHRONOUS auf, wenn die Protokollierung gestartet wird, und setzt sie zurück, wenn die Protokollierung beendet wird. Darüber hinaus wird jeder benutzerdefinierte OpenGL-Debug-Callback, der beim Aufruf dieser Funktion installiert wurde, wiederhergestellt, wenn die Protokollierung gestoppt wird; QOpenGLDebugLogger stellt sicher, dass der vorher existierende Callback beim Protokollieren weiterhin aufgerufen wird.

Hinweis: Es ist nicht möglich, den Protokollierungsmodus zu ändern, ohne die Protokollierung zu stoppen und erneut zu starten. Dies könnte sich in einer zukünftigen Version von Qt ändern.

Hinweis: Das Objekt muss initialisiert werden, bevor das Logging stattfinden kann.

Siehe auch stopLogging() und initialize().

[slot] void QOpenGLDebugLogger::stopLogging()

Stoppt die Protokollierung von Meldungen des OpenGL-Servers.

Siehe auch startLogging().

© 2025 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.