1. 初始化OpenGL窗口
任务目标
创建一个基于Qt Widgets的应用程序,通过QOpenGLWidget子类完成OpenGL上下文的初始化,并在窗口中显示一个指定颜色的空白背景。本案例验证Qt与OpenGL的集成链路是否打通,为后续渲染实战奠定基础。
环境依赖
- Qt 5.12+ 或 Qt 6.x(需包含
widgets与opengl模块) - 支持OpenGL 2.0及以上版本的显卡驱动
- 编译器:MSVC 2019+ / MinGW / GCC / Clang 均可
完整实现代码
// main.cpp
#include <QApplication>
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QSurfaceFormat>
class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
public:
GLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) {}
protected:
void initializeGL() override {
initializeOpenGLFunctions();
glClearColor(0.2f, 0.3f, 0.4f, 1.0f); // 深蓝灰色背景
}
void paintGL() override {
glClear(GL_COLOR_BUFFER_BIT);
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// 请求OpenGL 3.3 Core Profile(可选,但推荐)
QSurfaceFormat format;
format.setVersion(3, 3);
format.setProfile(QSurfaceFormat::CoreProfile);
QSurfaceFormat::setDefaultFormat(format);
GLWidget widget;
widget.resize(800, 600);
widget.show();
return app.exec();
}
项目文件(.pro)
QT += widgets opengl
CONFIG += c++11
SOURCES += main.cpp
运行与验证
- 构建:在Qt Creator中打开
.pro文件,或使用命令行:qmake && make # Linux/macOS qmake && nmake # Windows MSVC - 运行:执行生成的可执行文件,应弹出800×600的窗口。
- 通过条件:
- 窗口正常显示且无崩溃;
- 窗口背景为深蓝灰色(RGB约52,77,102);
- 调整窗口大小时背景色保持不变,无花屏或闪烁。
关键说明
initializeGL()在OpenGL上下文创建后调用一次,此处完成函数指针解析与清屏色设置;paintGL()在每次窗口需要重绘时调用,此处仅执行颜色缓冲清除;- 若系统不支持OpenGL 3.3 Core Profile,可删除
QSurfaceFormat设置代码,Qt将自动使用兼容模式(默认2.0),代码仍可正常工作。