Qt+OpenGL

OpenGLEntity.h

cpp 复制代码
#ifndef OPENGLENTITY_H
#define OPENGLENTITY_H

//#include <QWidget>
#include <QOpenGLWidget>
#include <QOpenGLFunctions_3_3_Core>
#include <QOpenGLShaderProgram>
#include <QOpenGLBuffer>
#include <QOpenGLVertexArrayObject>

class OpenGLEntity : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core
{
    Q_OBJECT
public:
    explicit OpenGLEntity(QWidget *parent = 0);
    ~OpenGLEntity();

signals:

public slots:

protected:
    void initializeGL() override;
    void resizeGL(int w, int h) override;
    void paintGL() override;

private:
    QOpenGLShaderProgram program;
    QOpenGLBuffer vertexBuffer;
    QOpenGLVertexArrayObject vao;
};

#endif // OPENGLENTITY_H

OpenGLEntity.cpp

cpp 复制代码
#include "OpenGLEntity.h"

OpenGLEntity::OpenGLEntity(QWidget *parent) : QOpenGLWidget(parent)
{

}

OpenGLEntity::~OpenGLEntity()
{
    makeCurrent();
    vertexBuffer.destroy();
    vao.destroy();
    doneCurrent();
}


void OpenGLEntity::initializeGL()
{
    initializeOpenGLFunctions();

    // 编译顶点着色器
    const char *vertexShaderSource = R"(
        #version 330 core
        layout (location = 0) in vec3 aPos;
        void main()
        {
            gl_Position = vec4(aPos, 1.0);
        }
    )";
    program.addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource);

    // 编译片段着色器
    const char *fragmentShaderSource = R"(
        #version 330 core
        out vec4 FragColor;
        void main()
        {
            FragColor = vec4(1.0, 0.5, 0.2, 1.0); // 橙色
        }
    )";
    program.addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource);

    // 链接程序
    program.link();

    // 检查链接是否成功
    if (!program.isLinked()) {
        qDebug() << "Failed to link program:" << program.log();
        return;
    }

    // 设置顶点数据(一个三角形)
    float vertices[] = {
        -0.5f, -0.5f, 0.0f,
         0.5f, -0.5f, 0.0f,
         0.0f,  0.5f, 0.0f
    };

    // 创建并绑定 VBO
    vertexBuffer.create();
    vertexBuffer.bind();
    vertexBuffer.allocate(vertices, sizeof(vertices));

    // 创建并绑定 VAO
    vao.create();
    vao.bind();

    // 设置顶点属性指针
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(0);

    // 解绑 VAO 和 VBO
    vao.release();
    vertexBuffer.release();
}

void OpenGLEntity::resizeGL(int w, int h)
{
    glViewport(0, 0, w, h);
}

void OpenGLEntity::paintGL()
{
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f); // 设置背景颜色为深灰色
    glClear(GL_COLOR_BUFFER_BIT);

    // 使用我们的着色器程序
    program.bind();

    // 绘制三角形
    vao.bind();
    glDrawArrays(GL_TRIANGLES, 0, 3);
    vao.release();
}

MainWindow.cpp

cpp 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include"OpenGLEntity.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    OpenGLEntity *openglentity;
};

#endif // MAINWINDOW_H

MainWindow.cpp

cpp 复制代码
#include "MainWindow.h"
#include "ui_MainWindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    resize(800,600);
    openglentity = new OpenGLEntity(this);
    setCentralWidget(openglentity);
}

MainWindow::~MainWindow()
{
    delete ui;
}
相关推荐
LilySesy4 分钟前
【SAP-MOM项目】二、接口对接(中)
开发语言·python·pandas·restful·sap·abap
零度@6 分钟前
专为 Java 开发者 整理的《Python编程:从入门到实践》前8章核心内容
java·开发语言·windows·python
nbsaas-boot11 分钟前
架构设计怎么做:一套可复用、可落地的方法论
java·开发语言·微服务
骆驼爱记录11 分钟前
Word表格题注自动设置全攻略
开发语言·c#·自动化·word·excel·wps·新人首发
wbs_scy13 分钟前
C++:智能指针完全指南(原理、用法与避坑实战,从 RAII 到循环引用)
开发语言·c++·算法
无人装备硬件开发爱好者15 分钟前
Python + Blender 5.0 几何节点全栈实战教程1
开发语言·python·blender
u01092727115 分钟前
C++中的对象池模式
开发语言·c++·算法
武超杰16 分钟前
深入理解JDBC:Java数据库连接的核心技术与实践
java·开发语言·数据库·jdbc
80530单词突击赢19 分钟前
MPPI算法:ROS下的智能控制实战
开发语言·python
qinyia19 分钟前
如何在服务器上查看网络连接数并进行综合分析
linux·运维·服务器·开发语言·人工智能·php