QOpenGLDebugLogger Class
Der QOpenGLDebugLogger ermöglicht die Protokollierung von OpenGL-Debugging-Meldungen. Mehr...
| Header: | #include <QOpenGLDebugLogger> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS OpenGL) target_link_libraries(mytarget PRIVATE Qt6::OpenGL) |
| qmake: | QT += opengl |
| Erbt von: | QObject |
- Liste aller Mitglieder, einschließlich geerbter Mitglieder
- QOpenGLDebugLogger ist Teil von „Rendering in 3D“.
Öffentliche Typen
| enum | LoggingMode { AsynchronousLogging, SynchronousLogging } |
Eigenschaften
- loggingMode : LoggingMode
Ö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) |
Ausführliche Beschreibung
Einleitung
Die OpenGL-Programmierung kann sehr fehleranfällig sein. Meistens kann bereits ein einziger fehlgeschlagener OpenGL-Aufruf dazu führen, dass ein ganzer Teil einer Anwendung nicht mehr funktioniert und auf dem Bildschirm nichts mehr angezeigt wird.
Die einzige Möglichkeit, sicherzustellen, dass von der OpenGL-Implementierung keine Fehler zurückgegeben werden, besteht darin, nach jedem einzelnen API-Aufruf mit ` glGetError ` zu prüfen. Da sich OpenGL-Fehler zudem anhäufen, 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 löschen, achten Sie darauf, nicht einfach so lange fortzufahren, bis GL_NO_ERROR zurückgegeben wird, sondern auch bei GL_CONTEXT_LOST abzubrechen, da dieser Fehlerwert immer wieder auftritt.
Es gibt noch viele weitere Informationen, die für uns (als Anwendungsentwickler) von Interesse sind, beispielsweise Leistungsprobleme oder Warnungen zur Verwendung veralteter APIs. Diese Art von Meldungen werden nicht über die üblichen OpenGL-Fehlermeldemechanismen gemeldet.
QOpenGLDebugLogger zielt darauf ab, diese Probleme zu beheben, indem es Zugriff auf das OpenGL-Debug-Protokoll bietet. Wenn Ihre OpenGL-Implementierung dies unterstützt (durch Bereitstellung der Erweiterung „ GL_KHR_debug “), werden Meldungen vom OpenGL-Server entweder in einem internen OpenGL-Protokoll protokolliert oder „in Echtzeit“ an Listener weitergeleitet, sobald sie von OpenGL generiert werden.
QOpenGLDebugLogger unterstützt beide Betriebsmodi. In den folgenden Abschnitten erfahren Sie mehr über die Unterschiede zwischen diesen Modi.
Erstellen eines OpenGL-Debug-Kontexts
Aus Effizienzgründen ist es OpenGL-Implementierungen gestattet, überhaupt keine Debug-Ausgabe zu erzeugen, es sei denn, der OpenGL-Kontext ist ein Debug-Kontext. Um einen Debug-Kontext über Qt zu erstellen, müssen Sie die Formatoption „ QSurfaceFormat::DebugContext “ für den „ QSurfaceFormat “ festlegen, der 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 OpenGL-Core-Profils 3.2 nur zu Beispielzwecken dient; diese Klasse ist nicht an eine bestimmte OpenGL- oder OpenGL ES-Version gebunden, da sie auf der Verfügbarkeit der Erweiterung „ GL_KHR_debug “ beruht (siehe unten).
Erstellen und Initialisieren eines `QOpenGLDebugLogger`
`QOpenGLDebugLogger` ist eine einfache, von ` QObject` abgeleitete Klasse. Genau wie bei allen Unterklassen von ` QObject ` erstellen Sie eine Instanz (und geben optional ein übergeordnetes Objekt an), und wie bei den anderen OpenGL-Funktionen in Qt müssen Sie diese vor der Verwendung initialisieren, indem Sie ` initialize()` aufrufen, solange ein aktueller OpenGL-Kontext vorhanden ist:
QOpenGLContext *ctx = QOpenGLContext::currentContext();
QOpenGLDebugLogger *logger = new QOpenGLDebugLogger(this);
logger->initialize(); // initializes in the current context, i.e. ctxBeachten 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 durch den Aufruf von:
ctx->hasExtension(QByteArrayLiteral("GL_KHR_debug"));wobei ` ctx ` ein gültiger ` QOpenGLContext` ist. Ist die Erweiterung nicht verfügbar, gibt ` initialize()` den Wert `false` zurück.
Auslesen des internen OpenGL-Debug-Protokolls
OpenGL-Implementierungen führen ein internes Protokoll mit Debug-Meldungen. Die in diesem Protokoll gespeicherten Meldungen können mithilfe 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 neu eingehende Meldungen zu schaffen. Wenn Sie ` loggedMessages()` aufrufen, wird das interne Protokoll ebenfalls geleert.
Wenn Sie sicherstellen möchten, dass keine Debug-Meldung verloren geht, müssen Sie anstelle des Aufrufs dieser Funktion die Echtzeitprotokollierung verwenden. Es können jedoch weiterhin Debug-Meldungen in der Zeitspanne zwischen der Erstellung des Kontexts und der Aktivierung der Echtzeitprotokollierung (oder generell, wenn die Echtzeitprotokollierung deaktiviert ist) generiert werden.
Echtzeit-Protokollierung von Meldungen
Es ist auch möglich, einen Strom von Debug-Meldungen vom OpenGL-Server zu empfangen, sobald diese von der Implementierung generiert werden. Dazu müssen Sie einen geeigneten Slot mit dem Signal ` messageLogged()` verbinden und die Protokollierung durch 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 Echtzeitprotokollierung kann je nach dem an ` startLogging()` übergebenen Parameter entweder asynchron oder synchron erfolgen. Bei der Protokollierung im asynchronen Modus (Standard, da er einen sehr geringen Overhead aufweist) kann die OpenGL-Implementierung Meldungen jederzeit und/oder in einer Reihenfolge generieren, die von der Reihenfolge der OpenGL-Befehle abweicht, die zur Protokollierung dieser Meldungen geführt haben. Die Meldungen können auch von einem Thread generiert werden, der sich von dem Thread unterscheidet, an den der Kontext derzeit gebunden ist. Dies liegt daran, dass OpenGL-Implementierungen in der Regel stark multithreaded und asynchron sind, weshalb keine Garantien hinsichtlich der relativen Reihenfolge und des Zeitpunkts der Debug-Meldungen gegeben werden.
Andererseits ist die Protokollierung im synchronen Modus mit hohem Overhead verbunden, aber die OpenGL-Implementierung garantiert, dass alle durch einen bestimmten Befehl ausgelösten Meldungen in der richtigen Reihenfolge empfangen werden, bevor der Befehl zurückkehrt, und zwar von demselben Thread, an den der OpenGL-Kontext gebunden ist.
Das bedeutet, dass Sie bei der Protokollierung im synchronen Modus Ihre OpenGL-Anwendung in einem Debugger ausführen, einen Haltepunkt an einem Slot setzen können, der mit dem Signal „ messageLogged()“ verbunden ist, und im Backtrace den genauen Aufruf sehen können, der die protokollierte Meldung ausgelöst hat. Dies kann für die Fehlersuche bei einem OpenGL-Problem äußerst nützlich sein. Beachten Sie, dass Sie, falls das OpenGL-Rendering in einem anderen Thread erfolgt, den Signal-/Slot-Verbindungstyp auf „ Qt::DirectConnection “ festlegen müssen, um den tatsächlichen Backtrace sehen zu können.
Weitere Informationen zu den Protokollierungsmodi finden Sie in der Dokumentation zur Enumeration „ LoggingMode “.
Hinweis: Wenn die Echtzeitprotokollierung aktiviert ist, werden Debug-Meldungen nicht mehr in das interne OpenGL-Debug-Protokoll eingefügt; bereits im internen Protokoll vorhandene Meldungen werden weder gelöscht noch über das Signal „ messageLogged()“ ausgegeben. Da möglicherweise einige Meldungen vor dem Start der Echtzeit-Protokollierung generiert wurden (und daher im internen OpenGL-Protokoll verbleiben), ist es wichtig, nach dem Aufruf von ` startLogging()` stets zu überprüfen, ob dieses Meldungen enthält.
Einfügen von Meldungen in das Debug-Protokoll
Anwendungen und Bibliotheken können benutzerdefinierte Meldungen in das Debug-Protokoll einfügen, beispielsweise um eine Gruppe zusammenhängender OpenGL-Befehle zu kennzeichnen und so eventuelle von diesen stammende Meldungen identifizieren zu können.
Dazu können Sie ein ` QOpenGLDebugMessage `-Objekt erstellen, indem Sie ` createApplicationMessage()` oder ` createThirdPartyMessage()` aufrufen, und es anschließend durch Aufruf von ` logMessage()` in das Protokoll einfügen:
QOpenGLDebugMessage message =
QOpenGLDebugMessage::createApplicationMessage(QStringLiteral("Custom message"));
logger->logMessage(message);Beachten Sie, dass OpenGL-Implementierungen eine herstellerspezifische Begrenzung 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 Aufruf der Methode ` maximumMessageLength()` abrufen; Meldungen, die länger als diese Grenze sind, werden automatisch gekürzt.
Steuerung der Debug-Ausgabe
QOpenGLDebugMessage kann zudem Filter auf die Debug-Meldungen anwenden und so die Anzahl der protokollierten Meldungen begrenzen. Sie können die Protokollierung von Meldungen aktivieren oder deaktivieren, indem Sie jeweils enableMessages() und disableMessages() aufrufen. Standardmäßig werden alle Meldungen protokolliert.
Es ist möglich, Meldungen durch Auswahl folgender Kriterien zu aktivieren oder zu deaktivieren:
- Quelle, Typ und Schweregrad (wobei alle IDs in die Auswahl einbezogen werden);
- ID, Quelle und Typ (wobei alle Schweregrade in die Auswahl einbezogen werden).
Beachten Sie, dass der Status „aktiviert“ für eine bestimmte Meldung eine Eigenschaft des Tupels (ID, Quelle, Typ, Schweregrad) ist; die Meldungsattribute bilden keinerlei Hierarchie. Sie sollten auf die Reihenfolge der Aufrufe von ` enableMessages()` und ` disableMessages()` achten, da sich dadurch ändert, welche Meldungen aktiviert bzw. deaktiviert werden.
Es ist nicht möglich, nach dem Meldungstext selbst zu filtern; Anwendungen müssen dies selbst übernehmen (in Slots, die mit dem Signal ` messageLogged()` verbunden sind, oder nach dem Abrufen der Meldungen im internen Debug-Protokoll über ` loggedMessages()`).
Um die Verwaltung der Aktivierungs-/Deaktivierungszustände zu vereinfachen, unterstützt „ QOpenGLDebugMessage “ außerdem das Konzept der „ debug groups “. Eine Debug-Gruppe enthält die Gesamtheit der aktivierten bzw. deaktivierten Konfigurationen von Debug-Meldungen. Zudem sind Debug-Gruppen in einem Stapel organisiert: Es ist möglich, Gruppen durch Aufruf von pushGroup() bzw. popGroup() auf den Stapel zu schieben bzw. vom Stapel 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 ganz oben im Debug-Gruppen-Stapel befindet.
Wenn eine neue Gruppe auf den Debug-Gruppen-Stapel gelegt wird, übernimmt sie die Konfiguration der Gruppe, die zuvor ganz oben auf dem Stapel lag. Umgekehrt wird durch das Entfernen einer Debug-Gruppe die Konfiguration der Debug-Gruppe wiederhergestellt, die nun an die Spitze rückt.
Das Einfügen (bzw. Entfernen) von Debug-Gruppen generiert außerdem automatisch eine Debug-Meldung vom Typ „ QOpenGLDebugMessage::GroupPushType “ (bzw. „ GroupPopType “).
Siehe auch „ QOpenGLDebugMessage “.
Dokumentation zu Mitgliedstypen
enum QOpenGLDebugLogger::LoggingMode
Die Enumeration „LoggingMode“ definiert den Protokollierungsmodus des Logger-Objekts.
| Konstante | Wert | Beschreibung |
|---|---|---|
QOpenGLDebugLogger::AsynchronousLogging | 0 | Meldungen vom OpenGL-Server werden asynchron protokolliert. Das bedeutet, dass Meldungen erst einige Zeit nach den entsprechenden OpenGL-Aktionen, die sie ausgelöst haben, protokolliert werden können und je nach OpenGL-Implementierung sogar in ungeordneter Reihenfolge empfangen werden können. Dieser Modus hat nur sehr geringe Leistungseinbußen, da OpenGL-Implementierungen von Natur aus stark multithreaded und asynchron sind. |
QOpenGLDebugLogger::SynchronousLogging | 1 | Meldungen vom OpenGL-Server werden synchron und sequenziell protokolliert. Dies führt zu erheblichen Leistungseinbußen, da OpenGL-Implementierungen von Natur aus sehr asynchron sind; es ist jedoch sehr nützlich zur Fehlerbehebung bei OpenGL-Problemen, da OpenGL garantiert, dass die von einem OpenGL-Befehl generierten Meldungen protokolliert werden, bevor die Ausführung des entsprechenden Befehls beendet ist. Daher können Sie einen Haltepunkt am Signal „ messageLogged()“ setzen und im Backtrace sehen, welcher OpenGL-Befehl ihn ausgelöst hat; der einzige Vorbehalt besteht darin, dass Sie bei der Verwendung von OpenGL aus mehreren Threads möglicherweise eine direkte Verbindung erzwingen müssen, wenn Sie sich mit dem Signal „ messageLogged()“ verbinden. |
Dokumentation zu den Eigenschaften
[read-only] loggingMode : LoggingMode
Diese Eigenschaft enthält den an ` startLogging()` übergebenen Protokollierungsmodus.
Beachten Sie, dass die Protokollierung bereits gestartet sein muss, da der Wert dieser Eigenschaft sonst keine Bedeutung hat.
Zugriffsfunktionen:
| QOpenGLDebugLogger::LoggingMode | loggingMode() const |
Siehe auch „ startLogging()“ und „ isLogging()“.
Dokumentation der Member-Funktionen
[explicit] QOpenGLDebugLogger::QOpenGLDebugLogger(QObject *parent = nullptr)
Erstellt ein neues Logger-Objekt mit dem angegebenen „ parent “.
Hinweis: Das Objekt muss initialisiert werden, bevor eine Protokollierung erfolgen kann.
Siehe auch ` initialize()`.
[virtual noexcept] QOpenGLDebugLogger::~QOpenGLDebugLogger()
Löscht 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 Meldungen mit dem angegebenen „ sources “, der angegebenen „ types “ und dem angegebenen „ severities “ sowie mit beliebigen Meldungs-IDs.
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 Meldungen mit dem angegebenen „ ids “, vom angegebenen „ sources “ und mit dem angegebenen „ types “ sowie aller Schweregrade.
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 Meldungen aus dem angegebenen „ sources “, des angegebenen „ types “ sowie mit dem angegebenen „ severities “ und beliebigen Meldungs-IDs.
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 Meldungen mit der angegebenen „ ids “, von der angegebenen „ sources “ und mit dem angegebenen „ types “ sowie mit beliebiger Schwere.
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 verläuft. Das Objekt muss initialisiert werden, bevor eine Protokollierung erfolgen kann.
Es ist unbedenklich, diese Funktion mehrmals aus demselben Kontext heraus aufzurufen.
Diese Funktion kann auch verwendet werden, um den Kontext eines zuvor initialisierten Objekts zu ändern; beachte, dass das Objekt in diesem Fall zum Zeitpunkt des Aufrufs dieser Funktion keine Protokollierung durchführen darf.
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 derzeit Protokolle aufzeichnet, 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 Anwendungen oder Bibliotheken die Möglichkeit, benutzerdefinierte Meldungen einzufügen, die die Fehlersuche in OpenGL-Anwendungen erleichtern können.
Hinweis: „ debugMessage “ muss als Quelle „ QOpenGLDebugMessage::ApplicationSource “ oder „ QOpenGLDebugMessage::ThirdPartySource “ sowie einen gültigen Typ und Schweregrad aufweisen, andernfalls wird die Meldung nicht in das Protokoll eingefügt.
Hinweis: Das Objekt muss initialisiert sein, bevor eine Protokollierung erfolgen kann.
Siehe auch ` initialize()`.
QList<QOpenGLDebugMessage> QOpenGLDebugLogger::loggedMessages() const
Liest alle verfügbaren Meldungen aus dem internen OpenGL-Debug-Protokoll aus und gibt sie zurück. Zudem löscht diese Funktion das interne Debug-Protokoll, sodass bei nachfolgenden Aufrufen keine Meldungen zurückgegeben werden, 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 Byte für den Text der an logMessage() übergebenen Nachrichten zurück. Dies ist auch die maximale Länge eines Debug-Gruppennamens, da beim Einfügen oder Entfernen von Gruppen automatisch eine Nachricht protokolliert wird, deren Text aus dem Debug-Gruppennamen besteht.
Ist ein Meldungstext zu lang, wird er von ` QOpenGLDebugLogger` automatisch gekürzt.
Hinweis: Nachrichtentexte werden bei der Übergabe an OpenGL in UTF-8 kodiert, sodass ihre Größe in Byte in der Regel nicht mit der Anzahl der UTF-16-Codeeinheiten übereinstimmt, wie sie beispielsweise von ` QString::length()` zurückgegeben wird. (Dies ist jedoch der Fall, wenn die Nachricht ausschließlich 7-Bit-ASCII-Daten enthält, was typisch für Debug-Meldungen ist.)
[signal] void QOpenGLDebugLogger::messageLogged(const QOpenGLDebugMessage &debugMessage)
Dieses Signal wird ausgelöst, wenn eine Debug-Meldung (umschlossen vom Argument „ debugMessage “) vom OpenGL-Server protokolliert wird.
Je nach OpenGL-Implementierung kann dieses Signal von anderen Threads als dem/denjenigen, in denen sich der/die Empfänger befinden, und sogar von einem anderen Thread als dem, in dem sich der ` QOpenGLContext ` befindet, in dem dieses Objekt initialisiert wurde, ausgelöst werden. Zudem kann das Signal von mehreren Threads gleichzeitig ausgelöst werden. Dies stellt normalerweise kein Problem dar, da Qt für die threadübergreifende Signalausgabe eine Queued-Verbindung verwendet; wenn Sie jedoch den Verbindungstyp auf „Direct“ festlegen, müssen Sie sich der potenziellen Race-Conditions 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 ausgesendet wird, an den der „ QOpenGLContext “ gebunden ist, und es niemals zu gleichzeitigen Aufrufen kommt.
Hinweis: Die Protokollierung muss gestartet worden sein, andernfalls wird dieses Signal nicht ausgegeben.
Siehe auch ` startLogging()`.
void QOpenGLDebugLogger::popGroup()
Entfernt die oberste Debug-Gruppe aus dem Stack der Debug-Gruppen. Wenn die Gruppe erfolgreich entfernt wurde, protokolliert OpenGL automatisch eine Meldung, deren „message“, „id“ und „source“ mit denen der entfernten Gruppe übereinstimmen, deren Typ „ QOpenGLDebugMessage::GroupPopType “ und deren Schweregrad „ QOpenGLDebugMessage::NotificationSeverity “ ist.
Das Entfernen einer Debug-Gruppe stellt die Einstellungen zur Meldungsfilterung der Gruppe wieder her, die nun an die Spitze des Debug-Gruppen-Stacks rückt.
Hinweis: Das Objekt muss initialisiert sein, bevor Debug-Gruppen verwaltet werden können.
Siehe auch ` pushGroup()`.
void QOpenGLDebugLogger::pushGroup(const QString &name, GLuint id = 0, QOpenGLDebugMessage::Source source = QOpenGLDebugMessage::ApplicationSource)
Fügt eine Debug-Gruppe mit dem Namen „ name “, der ID „ id “ und der Quelle „ source “ zum Stack der Debug-Gruppen hinzu. Wenn die Gruppe erfolgreich hinzugefügt wurde, protokolliert OpenGL automatisch eine Meldung mit dem Meldungstext „ name “, der ID „ id “, der Quelle „ source “, dem Typ „ QOpenGLDebugMessage::GroupPushType “ und dem Schweregrad „ QOpenGLDebugMessage::NotificationSeverity “.
Die neu eingefügte Gruppe übernimmt die gleichen Filtereinstellungen wie die Gruppe, die sich an der Spitze des Stacks befand; das heißt, die Filterung wird durch das Einfügen einer neuen Gruppe nicht verändert.
Hinweis: Die „ source “ muss entweder „ QOpenGLDebugMessage::ApplicationSource “ oder „ QOpenGLDebugMessage::ThirdPartySource “ lauten, andernfalls wird die Gruppe nicht hinzugefügt.
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 Meldungen, die vom OpenGL-Server kommen. Wenn eine neue Meldung empfangen wird, wird das Signal „ messageLogged()“ ausgelöst, das die protokollierte Meldung als Argument enthält.
loggingMode Legt fest, ob die Protokollierung asynchron (Standard) oder synchron erfolgen soll.
QOpenGLDebugLogger Zeichnet die Werte von ` GL_DEBUG_OUTPUT ` und ` GL_DEBUG_OUTPUT_SYNCHRONOUS ` beim Start der Protokollierung auf und setzt sie beim Beenden der Protokollierung wieder zurück. Darüber hinaus werden alle benutzerdefinierten OpenGL-Debug-Callbacks, die beim Aufruf dieser Funktion installiert waren, beim Beenden der Protokollierung wiederhergestellt; ` QOpenGLDebugLogger ` stellt sicher, dass der bereits vorhandene Callback bei der Protokollierung weiterhin aufgerufen wird.
Hinweis: Es ist nicht möglich, den Protokollierungsmodus zu ändern, ohne die Protokollierung zu beenden und erneut zu starten. Dies könnte sich in einer zukünftigen Version von Qt ändern.
Hinweis: Das Objekt muss initialisiert sein, bevor die Protokollierung erfolgen kann.
Siehe auch „ stopLogging()“ und „ initialize()“.
[slot] void QOpenGLDebugLogger::stopLogging()
Beendet die Protokollierung von Meldungen des OpenGL-Servers.
Siehe auch „ startLogging()“.
© 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.