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

运行与验证

  1. 构建:在Qt Creator中打开.pro文件,或使用命令行:
    qmake && make   # Linux/macOS
    qmake && nmake   # Windows MSVC
  2. 运行:执行生成的可执行文件,应弹出800×600的窗口。
  3. 通过条件:
    • 窗口正常显示且无崩溃;
    • 窗口背景为深蓝灰色(RGB约52,77,102);
    • 调整窗口大小时背景色保持不变,无花屏或闪烁。

关键说明

  • initializeGL()在OpenGL上下文创建后调用一次,此处完成函数指针解析与清屏色设置;
  • paintGL()在每次窗口需要重绘时调用,此处仅执行颜色缓冲清除;
  • 若系统不支持OpenGL 3.3 Core Profile,可删除QSurfaceFormat设置代码,Qt将自动使用兼容模式(默认2.0),代码仍可正常工作。