1. 概述
QOpenGLContext
是 Qt 提供的一个类,用于管理 OpenGL 上下文。它封装了 OpenGL 上下文的创建、配置和管理功能,使得开发者可以在 Qt 应用程序中以平台无关的方式使用 OpenGL。通过 QOpenGLContext
,可以轻松地创建和管理 OpenGL 上下文,并与 Qt 的窗口系统集成。
2. 重要函数
构造和析构
-
QOpenGLContext(QObject *parent = nullptr)
构造函数,创建一个新的
QOpenGLContext
实例。 -
virtual ~QOpenGLContext()
虚析构函数,确保资源被正确释放。
上下文创建和初始化
-
bool create()
创建 OpenGL 上下文。必须在设置格式、屏幕和共享上下文后调用。
-
bool isValid() const
检查上下文是否成功创建。
上下文管理
-
bool makeCurrent(QSurface *surface)
将上下文设置为当前线程的当前上下文,并与指定表面关联。
-
void doneCurrent()
使当前线程没有上下文成为当前上下文。
-
void swapBuffers(QSurface *surface)
交换指定表面的前后缓冲区。
格式和屏幕
-
void setFormat(const QSurfaceFormat &format)
设置上下文的格式。
-
QSurfaceFormat format() const
获取上下文的实际格式。
-
void setScreen(QScreen *screen)
设置上下文的屏幕。
-
QScreen *screen() const
获取上下文的屏幕。
资源共享
-
void setShareContext(QOpenGLContext *shareContext)
设置共享上下文。
-
QOpenGLContext *shareContext() const
获取共享上下文。
OpenGL 函数访问
-
QOpenGLFunctions *functions() const
获取当前上下文的
QOpenGLFunctions
实例。 -
QOpenGLExtraFunctions *extraFunctions() const
获取当前上下文的
QOpenGLExtraFunctions
实例。 -
QFunctionPointer getProcAddress(const QByteArray &procName) const
获取指定 OpenGL 函数的指针。
-
QFunctionPointer getProcAddress(const char *procName) const
获取指定 OpenGL 函数的指针。
扩展和版本
-
QSet<QByteArray> extensions() const
获取上下文支持的 OpenGL 扩展。
-
bool hasExtension(const QByteArray &extension) const
检查上下文是否支持指定的扩展。
-
bool isOpenGLES() const
检查上下文是否为 OpenGL ES。
-
QAbstractOpenGLFunctions *versionFunctions(const QOpenGLVersionProfile &versionProfile = QOpenGLVersionProfile()) const
获取指定版本的 OpenGL 函数集。
其他
-
GLuint defaultFramebufferObject() const
获取当前表面的默认帧缓冲对象。
-
QVariant nativeHandle() const
获取上下文的原生句柄。
-
QSurface *surface() const
获取当前关联的表面。
3. 静态公共成员
QOpenGLContext
提供了一些静态公共成员函数,这些函数主要用于全局管理 OpenGL 上下文和查询 OpenGL 环境的状态。这些静态函数可以在不创建 QOpenGLContext
实例的情况下直接使用。
-
bool areSharing(QOpenGLContext *first, QOpenGLContext *second)
检查两个
QOpenGLContext
实例是否共享资源。
参数:-
first
:第一个 OpenGL 上下文。 -
second
:第二个 OpenGL 上下文。
返回值 :如果两个上下文共享资源,则返回true
,否则返回false
。
用途:确认两个上下文是否可以访问彼此的资源(如纹理、缓冲区等)。
-
-
QOpenGLContext *currentContext()
获取当前线程的当前 OpenGL 上下文。
返回值 :返回当前线程的当前QOpenGLContext
实例,如果没有上下文,则返回nullptr
。
用途:查询当前线程中正在使用的 OpenGL 上下文,常用于调试或在多上下文环境中管理资源。 -
QOpenGLContext *globalShareContext()
获取全局共享上下文。
返回值 :返回全局共享的QOpenGLContext
实例,如果没有设置全局共享上下文,则返回nullptr
。
用途:全局共享上下文通常用于在多个窗口或上下文之间共享资源。通过调用此函数,可以获取全局共享上下文,从而实现资源的共享。 -
void *openGLModuleHandle()
获取 OpenGL 模块的句柄。
返回值 :返回 OpenGL 模块的句柄(例如,HMODULE
在 Windows 上,void*
在其他平台上)。
用途:获取 OpenGL 动态链接库(DLL 或共享库)的句柄,以便进行进一步的模块操作或调试。 -
QOpenGLContext::OpenGLModuleType openGLModuleType()
获取 OpenGL 模块的类型。
返回值 :返回QOpenGLContext::OpenGLModuleType
枚举值,表示 OpenGL 模块的类型:-
DesktopOpenGL
:桌面 OpenGL。 -
OpenGLES
:OpenGL ES。 -
LibGL
:使用libGL
的 OpenGL。 -
LibGLES
:使用libGLES
的 OpenGL。
用途:查询当前系统中使用的 OpenGL 实现类型,这对于跨平台开发和调试非常有用。
-
-
bool supportsThreadedOpenGL()
检查系统是否支持多线程 OpenGL。
返回值 :如果系统支持多线程 OpenGL,则返回true
,否则返回false
。
用途 :确定是否可以在多线程环境中安全地使用 OpenGL。如果返回false
,则需要避免在多线程中使用 OpenGL,或者采取额外的同步措施。class OpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core {
public:
OpenGLWidget(QWidget parent = nullptr) : QOpenGLWidget(parent) {}
protected:
// 初始化 OpenGL 上下文
void initializeGL() override {
// 初始化 OpenGL 函数
initializeOpenGLFunctions();
// 获取当前 OpenGL 上下文
QOpenGLContext context = this->context();
if (context) {
qDebug() << "OpenGL context created:" << context->format().majorVersion() << "." << context->format().minorVersion();
}
// 设置清屏颜色
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
}
// 调整 OpenGL 视口
void resizeGL(int w, int h) override {
glViewport(0, 0, w, h);
}
// 绘制 OpenGL 场景
void paintGL() override {
// 清除颜色缓冲区
glClear(GL_COLOR_BUFFER_BIT);
// 定义三角形的顶点坐标和颜色
GLfloat vertices[] = {
// 位置 // 颜色
0.0f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // 顶部
-0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // 左下角
0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f // 右下角
};
// 创建并绑定顶点数组对象 (VAO)
GLuint VAO;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
// 创建并绑定顶点缓冲对象 (VBO)
GLuint VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// 设置顶点属性
// 位置属性
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid)0);
glEnableVertexAttribArray(0);
// 颜色属性
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid)(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(1);
// 绘制三角形
glDrawArrays(GL_TRIANGLES, 0, 3);
// 解绑 VAO 和 VBO
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}
};int main(int argc, char *argv[])
{
QApplication app(argc, argv);OpenGLWidget widget; widget.resize(800, 600); widget.show(); return app.exec();
}

觉得有帮助的话,打赏一下呗。。
需要商务合作(定制程序)的欢迎私信!!