QOpenGLContext Class
La clase QOpenGLContext representa un contexto OpenGL nativo, permitiendo el renderizado OpenGL en un QSurface. Más...
| Cabecera: | #include <QOpenGLContext> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui)target_link_libraries(mytarget PRIVATE Qt6::Gui) |
| qmake: | QT += gui |
| Hereda: | QObject |
- Lista de todos los miembros, incluyendo los heredados
- QOpenGLContext es parte de Renderizado en 3D.
Tipos Públicos
| enum | OpenGLModuleType { LibGL, LibGLES } |
Funciones Públicas
| QOpenGLContext(QObject *parent = nullptr) | |
| virtual | ~QOpenGLContext() |
| bool | create() |
| GLuint | defaultFramebufferObject() const |
| void | doneCurrent() |
| QSet<QByteArray> | extensions() const |
| QOpenGLExtraFunctions * | extraFunctions() const |
| QSurfaceFormat | format() const |
| QOpenGLFunctions * | functions() const |
| QFunctionPointer | getProcAddress(const QByteArray &procName) const |
| QFunctionPointer | getProcAddress(const char *procName) const |
| bool | hasExtension(const QByteArray &extension) const |
| bool | isOpenGLES() const |
| bool | isValid() const |
| bool | makeCurrent(QSurface *surface) |
| QNativeInterface * | nativeInterface() const |
| QScreen * | screen() const |
| void | setFormat(const QSurfaceFormat &format) |
| void | setScreen(QScreen *screen) |
| void | setShareContext(QOpenGLContext *shareContext) |
| QOpenGLContext * | shareContext() const |
| QOpenGLContextGroup * | shareGroup() const |
| QSurface * | surface() const |
| void | swapBuffers(QSurface *surface) |
Señales
| void | aboutToBeDestroyed() |
Miembros públicos estáticos
| bool | areSharing(QOpenGLContext *first, QOpenGLContext *second) |
| QOpenGLContext * | currentContext() |
| QOpenGLContext * | globalShareContext() |
| QOpenGLContext::OpenGLModuleType | openGLModuleType() |
| bool | supportsThreadedOpenGL() |
Descripción Detallada
QOpenGLContext representa el estado OpenGL de un contexto OpenGL subyacente. Para inicializar un contexto, configura su pantalla y formato de forma que coincidan con los de la superficie o superficies con las que se pretende utilizar el contexto, si es necesario haz que comparta recursos con otros contextos con setShareContext(), y finalmente llama a create(). Utilice el valor de retorno o isValid() para comprobar si el contexto se ha inicializado correctamente.
Un contexto puede hacerse actual contra una superficie dada llamando a makeCurrent(). Una vez finalizado el renderizado OpenGL, llama a swapBuffers() para intercambiar los buffers frontal y posterior de la superficie, de forma que el nuevo contenido renderizado se haga visible. Para poder soportar ciertas plataformas, QOpenGLContext requiere que llames de nuevo a makeCurrent() antes de empezar a renderizar un nuevo frame, después de llamar a swapBuffers().
Si el contexto no es necesario temporalmente, como cuando la aplicación no está renderizando, puede ser útil borrarlo para liberar recursos. Puedes conectarte a la señal aboutToBeDestroyed() para limpiar cualquier recurso que haya sido asignado con una propiedad diferente a la del propio QOpenGLContext.
Una vez que un QOpenGLContext se ha hecho actual, puedes renderizar en él de forma independiente de la plataforma usando los habilitadores OpenGL de Qt como QOpenGLFunctions, QOpenGLBuffer, QOpenGLShaderProgram, y QOpenGLFramebufferObject. También es posible usar la API OpenGL de la plataforma directamente, sin usar los habilitadores de Qt, aunque potencialmente a costa de la portabilidad. Esto último es necesario cuando se desea utilizar OpenGL 1.x u OpenGL ES 1.x.
Para más información sobre la API OpenGL, consulta la documentación oficial de OpenGL.
Para un ejemplo de como usar QOpenGLContext ver el ejemplo de OpenGL Window.
Afinidad de hilos
QOpenGLContext puede ser movido a un thread diferente con moveToThread(). No llame a makeCurrent() desde un hilo diferente al que pertenece el objeto QOpenGLContext. Un contexto sólo puede ser actual en un hilo y contra una superficie a la vez, y un hilo sólo tiene un contexto actual a la vez.
Uso compartido de recursos de contexto
Los recursos como texturas y objetos de búfer de vértices pueden compartirse entre contextos. Utiliza setShareContext() antes de llamar a create() para especificar que los contextos deben compartir estos recursos. QOpenGLContext mantiene internamente un seguimiento de un objeto QOpenGLContextGroup al que se puede acceder con shareGroup(), y que puede ser utilizado para encontrar todos los contextos en un determinado grupo de compartición. Un grupo de compartición está formado por todos los contextos que se han inicializado correctamente y que comparten con un contexto existente en el grupo de compartición. Un contexto no compartido tiene un grupo de compartición formado por un único contexto.
Memoria intermedia por defecto
En ciertas plataformas, un framebuffer distinto de 0 puede ser el frame buffer por defecto dependiendo de la superficie actual. En lugar de llamar a glBindFramebuffer(0), se recomienda utilizar glBindFramebuffer(ctx->defaultFramebufferObject()), para asegurar que tu aplicación es portable entre diferentes plataformas. Sin embargo, si utilizas QOpenGLFunctions::glBindFramebuffer(), esto se hace automáticamente por ti.
Advertencia: WebAssembly
Recomendamos que solo un QOpenGLContext se haga actual con un QSurface, durante todo el tiempo de vida del QSurface. Si se usa más de un contexto, es importante entender que múltiples instancias de QOpenGLContext pueden estar respaldadas por el mismo contexto nativo bajo la plataforma WebAssembly. Por lo tanto, llamar a makeCurrent() con el mismo QSurface en dos objetos QOpenGLContext puede no cambiar a un contexto nativo diferente en la segunda llamada. Como resultado, cualquier cambio de estado OpenGL realizado después de la segunda makeCurrent() puede alterar el estado del primer QOpenGLContext también, ya que todos están respaldados por el mismo contexto nativo.
Nota: Esto significa que cuando se utiliza WebAssembly con código Qt basado en OpenGL, puede ser necesario realizar algunas adaptaciones para tener en cuenta estas limitaciones.
Véase también QOpenGLFunctions, QOpenGLBuffer, QOpenGLShaderProgram, y QOpenGLFramebufferObject.
Documentación de tipos de miembros
enum QOpenGLContext::OpenGLModuleType
Este enum define el tipo de la implementación OpenGL subyacente.
| Constante | Valor | Descripción |
|---|---|---|
QOpenGLContext::LibGL | 0 | OpenGL |
QOpenGLContext::LibGLES | 1 | OpenGL ES 2.0 o superior |
Documentación de la función miembro
[explicit] QOpenGLContext::QOpenGLContext(QObject *parent = nullptr)
Crea una nueva instancia de contexto OpenGL con el objeto padre parent.
Antes de que pueda ser utilizado es necesario establecer el formato adecuado y llamar a create().
Véase también create() y makeCurrent().
[virtual noexcept] QOpenGLContext::~QOpenGLContext()
Destruye el objeto QOpenGLContext.
Si este es el contexto actual para el hilo, también se llama a doneCurrent().
[signal] void QOpenGLContext::aboutToBeDestroyed()
Esta señal se emite antes de que se destruya el contexto OpenGL nativo subyacente, para que los usuarios puedan limpiar los recursos OpenGL que, de otro modo, podrían quedar colgados en el caso de contextos OpenGL compartidos.
Si deseas que el contexto sea actual para poder realizar la limpieza, asegúrate de conectarte a la señal únicamente mediante una conexión directa.
Nota: En Qt for Python, esta señal no se recibirá cuando se emita desde el destructor de QOpenGLWidget o QOpenGLWindow debido a que la instancia de Python ya ha sido destruida. Recomendamos hacer las limpiezas en QWidget::hideEvent() en su lugar.
[static] bool QOpenGLContext::areSharing(QOpenGLContext *first, QOpenGLContext *second)
Devuelve true si los contextos first y second comparten recursos OpenGL.
bool QOpenGLContext::create()
Intenta crear el contexto OpenGL con la configuración actual.
La configuración actual incluye el formato, el contexto compartido y la pantalla.
Si la implementación de OpenGL en tu sistema no soporta la versión solicitada de contexto OpenGL, entonces QOpenGLContext intentará crear la versión más parecida. Las propiedades reales del contexto creado pueden consultarse utilizando el QSurfaceFormat devuelto por la función format(). Por ejemplo, si solicitas un contexto que soporte el perfil OpenGL 4.3 Core pero el driver y/o hardware sólo soporta contextos de perfil 3.2 Core entonces obtendrás un contexto de perfil 3.2 Core.
Devuelve true si el contexto nativo se ha creado correctamente y está listo para ser utilizado con makeCurrent(), swapBuffers(), etc.
Nota: Si el contexto ya existe, esta función destruye primero el contexto existente y luego crea uno nuevo.
Véase también makeCurrent() y format().
[static] QOpenGLContext *QOpenGLContext::currentContext()
Devuelve el último contexto que llamó a makeCurrent en el hilo actual, o nullptr, si no hay ningún contexto actual.
GLuint QOpenGLContext::defaultFramebufferObject() const
Llama a esto para obtener el objeto framebuffer por defecto para la superficie actual.
En algunas plataformas (por ejemplo, iOS) el objeto framebuffer por defecto depende de la superficie en la que se está renderizando, y puede ser diferente de 0. Por lo tanto, en lugar de llamar a glBindFramebuffer(0), deberías llamar a glBindFramebuffer(ctx->defaultFramebufferObject()) si quieres que tu aplicación funcione en diferentes plataformas Qt.
Si usas glBindFramebuffer() en QOpenGLFunctions no tienes que preocuparte por esto, ya que automáticamente vincula el defaultFramebufferObject() del contexto actual cuando se pasa 0.
Nota: Los widgets que renderizan a través de objetos framebuffer, como QOpenGLWidget y QQuickWidget, anularán el valor devuelto por esta función cuando la pintura esté activa, porque en ese momento el framebuffer "por defecto" correcto es el framebuffer de respaldo asociado al widget, no el específico de la plataforma perteneciente a la superficie de la ventana de nivel superior. Esto asegura el comportamiento esperado para esta función y otras clases que dependen de ella (por ejemplo, QOpenGLFramebufferObject::bindDefault() o QOpenGLFramebufferObject::release()).
Véase también QOpenGLFramebufferObject.
void QOpenGLContext::doneCurrent()
Función de conveniencia para llamar a makeCurrent con una superficie 0.
Esto resulta en que no hay contexto en el hilo actual.
Véase también makeCurrent() y currentContext().
QSet<QByteArray> QOpenGLContext::extensions() const
Devuelve el conjunto de extensiones OpenGL soportadas por este contexto.
El contexto o un contexto compartido debe ser actual.
Véase también hasExtension().
QOpenGLExtraFunctions *QOpenGLContext::extraFunctions() const
Obtiene la instancia de QOpenGLExtraFunctions para este contexto.
QOpenGLContext ofrece esto como una forma conveniente de acceder a QOpenGLExtraFunctions sin tener que gestionarlo manualmente.
El contexto o un contexto compartido debe ser actual.
La instancia QOpenGLExtraFunctions devuelta está lista para ser utilizada y no necesita que se llame a initializeOpenGLFunctions().
Nota: QOpenGLExtraFunctions contiene funciones cuya disponibilidad en tiempo de ejecución no está garantizada. La disponibilidad en tiempo de ejecución depende de la plataforma, el controlador gráfico y la versión de OpenGL solicitada por la aplicación.
Véase también QOpenGLFunctions y QOpenGLExtraFunctions.
QSurfaceFormat QOpenGLContext::format() const
Devuelve el formato del contexto de la plataforma subyacente, si se ha llamado a create().
En caso contrario, devuelve el formato solicitado.
El formato solicitado y el real pueden diferir. Solicitar una determinada versión de OpenGL no significa que el contexto resultante se dirija exactamente a la versión solicitada. Sólo se garantiza que la combinación versión/perfil/opciones para el contexto creado sea compatible con la solicitud, siempre y cuando el controlador sea capaz de proporcionar dicho contexto.
Por ejemplo, solicitar un contexto de perfil de núcleo OpenGL versión 3.x puede dar como resultado un contexto de perfil de núcleo OpenGL 4.x. Del mismo modo, una solicitud de OpenGL 2.1 puede dar como resultado un contexto OpenGL 3.0 con funciones obsoletas habilitadas. Por último, dependiendo del controlador, las versiones no compatibles pueden dar lugar a un fallo en la creación del contexto o a un contexto para la versión más compatible.
Diferencias similares son posibles en los tamaños de búfer, por ejemplo, el contexto resultante puede tener un búfer de profundidad mayor que el solicitado. Esto es perfectamente normal.
Véase también setFormat().
QOpenGLFunctions *QOpenGLContext::functions() const
Obtiene la instancia de QOpenGLFunctions para este contexto.
QOpenGLContext ofrece esto como una forma conveniente de acceder a QOpenGLFunctions sin tener que gestionarlo manualmente.
El contexto o un contexto compartido debe ser actual.
La instancia QOpenGLFunctions devuelta está lista para ser utilizada y no necesita que se llame a initializeOpenGLFunctions().
QFunctionPointer QOpenGLContext::getProcAddress(const QByteArray &procName) const
Resuelve el puntero de función a una función de extensión OpenGL, identificada por procName
Devuelve nullptr si no se encuentra dicha función.
QFunctionPointer QOpenGLContext::getProcAddress(const char *procName) const
Se trata de una función sobrecargada.
[static] QOpenGLContext *QOpenGLContext::globalShareContext()
Devuelve el contexto OpenGL compartido por toda la aplicación, si está presente. En caso contrario, devuelve nullptr.
Esto es útil si necesitas cargar objetos OpenGL (buffers, texturas, etc.) antes de crear o mostrar un QOpenGLWidget o QQuickWidget.
Advertencia: No intente que el contexto devuelto por esta función sea actual en ninguna superficie. En su lugar, puede crear un nuevo contexto que comparta con el global, y luego hacer actual el nuevo contexto.
Véase también Qt::AA_ShareOpenGLContexts, setShareContext(), y makeCurrent().
bool QOpenGLContext::hasExtension(const QByteArray &extension) const
Devuelve true si este contexto OpenGL soporta el OpenGL especificado extension, false en caso contrario.
El contexto o un contexto compartido debe ser actual.
Véase también extensions().
bool QOpenGLContext::isOpenGLES() const
Devuelve true si el contexto es un contexto OpenGL ES.
Si el contexto aún no se ha creado, el resultado se basa en el formato solicitado establecido mediante setFormat().
Véase también create(), format(), y setFormat().
bool QOpenGLContext::isValid() const
Devuelve si este contexto es válido, es decir, si se ha creado correctamente.
En algunas plataformas el valor de retorno de false para un contexto que fue creado previamente con éxito indica que el contexto OpenGL se ha perdido.
La forma típica de manejar escenarios de pérdida de contexto en aplicaciones es comprobar a través de esta función siempre que makeCurrent() falle y devuelva false. Si esta función devuelve entonces false, recree el contexto OpenGL nativo subyacente llamando a create(), vuelva a llamar a makeCurrent() y reinicie todos los recursos OpenGL.
En algunas plataformas las situaciones de pérdida de contexto no son algo que pueda evitarse. En otras, sin embargo, puede ser necesario optar por evitarlas. Esto puede hacerse habilitando ResetNotification en QSurfaceFormat. Esto llevará a establecer RESET_NOTIFICATION_STRATEGY_EXT en LOSE_CONTEXT_ON_RESET_EXT en el contexto OpenGL nativo subyacente. QOpenGLContext monitorizará entonces el estado a través de glGetGraphicsResetStatusEXT() en cada makeCurrent().
Véase también create().
bool QOpenGLContext::makeCurrent(QSurface *surface)
Hace que el contexto actual en el hilo actual, en contra de la dada surface. Devuelve true si tiene éxito; en caso contrario devuelve false. Esto último puede ocurrir si la superficie no está expuesta, o si el hardware gráfico no está disponible debido, por ejemplo, a que la aplicación está suspendida.
Si surface es nullptr esto equivale a llamar a doneCurrent().
Evita llamar a esta función desde un hilo distinto de aquel en el que vive la instancia QOpenGLContext. Si deseas utilizar QOpenGLContext desde un hilo diferente, primero debes asegurarte de que no se encuentra en el hilo actual, llamando a doneCurrent() si es necesario. Luego llama a moveToThread(otherThread) antes de usarlo en el otro hilo.
Por defecto Qt emplea una comprobación que impone la condición anterior sobre la afinidad de hilos. Aún es posible desactivar esta comprobación configurando el atributo de aplicación Qt::AA_DontCheckOpenGLContextThreadAffinity. Asegúrate de entender las consecuencias de usar QObjects desde fuera del hilo en el que viven, como se explica en la documentación de QObject thread affinity.
Ver también functions(), doneCurrent(), y Qt::AA_DontCheckOpenGLContextThreadAffinity.
template <typename QNativeInterface> QNativeInterface *QOpenGLContext::nativeInterface() const
Devuelve una interfaz nativa del tipo dado para el contexto.
Esta función proporciona acceso a la funcionalidad específica de la plataforma QOpenGLContext, tal y como se define en el espacio de nombres QNativeInterface:
Interfaz nativa para un contexto NSOpenGLContext en macOS | |
Interfaz nativa para un contexto EGL | |
Interfaz nativa para un contexto GLX | |
Interfaz nativa para un contexto WGL en Windows |
Si la interfaz solicitada no está disponible, se devuelve nullptr.
[static] QOpenGLContext::OpenGLModuleType QOpenGLContext::openGLModuleType()
Devuelve el tipo de implementación OpenGL subyacente.
En plataformas en las que la implementación de OpenGL no se carga dinámicamente, el valor de retorno se determina en tiempo de compilación y nunca cambia.
Nota: Una implementación OpenGL de escritorio también puede ser capaz de crear contextos compatibles con ES. Por lo tanto, en la mayoría de los casos es más apropiado comprobar QSurfaceFormat::renderableType() o utilizar la función de conveniencia isOpenGLES().
Nota: Esta función requiere que la instancia QGuiApplication ya esté creada.
QScreen *QOpenGLContext::screen() const
Devuelve la pantalla para la que se creó el contexto.
Véase también setScreen().
void QOpenGLContext::setFormat(const QSurfaceFormat &format)
Establece el format con el que el contexto OpenGL debe ser compatible. Es necesario llamar a create() para que surta efecto.
Cuando el formato no se establece explícitamente a través de esta función, se utilizará el formato devuelto por QSurfaceFormat::defaultFormat(). Esto significa que cuando se tienen varios contextos, las llamadas individuales a esta función pueden sustituirse por una única llamada a QSurfaceFormat::setDefaultFormat() antes de crear el primer contexto.
Véase también format().
void QOpenGLContext::setScreen(QScreen *screen)
Establece el screen para el que debe ser válido el contexto OpenGL. Es necesario llamar a create() para que tenga efecto.
Véase también screen().
void QOpenGLContext::setShareContext(QOpenGLContext *shareContext)
Hace que este contexto comparta texturas, shaders y otros recursos OpenGL con shareContext. Necesitas llamar a create() antes de que tenga efecto.
Véase también shareContext().
QOpenGLContext *QOpenGLContext::shareContext() const
Devuelve el contexto de compartición con el que se creó este contexto.
Si la plataforma subyacente no es capaz de soportar la compartición solicitada, devolverá 0.
Véase también setShareContext().
QOpenGLContextGroup *QOpenGLContext::shareGroup() const
Devuelve el grupo de acciones al que pertenece este contexto.
[static] bool QOpenGLContext::supportsThreadedOpenGL()
Devuelve true si la plataforma soporta renderizado OpenGL fuera del hilo principal (gui).
El valor está controlado por el plugin de plataforma en uso y también puede depender de los controladores gráficos.
QSurface *QOpenGLContext::surface() const
Devuelve la superficie con la que se ha hecho actual el contexto.
Se trata de la superficie pasada como argumento a makeCurrent().
void QOpenGLContext::swapBuffers(QSurface *surface)
Intercambia los buffers anterior y posterior de surface.
Llame a esto para terminar un fotograma de renderizado OpenGL, y asegúrese de llamar a makeCurrent() de nuevo antes de emitir cualquier otro comando OpenGL, por ejemplo, como parte de un nuevo fotograma.
© 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.