三角形

main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <QMainWindow>
#include <QVBoxLayout>
#include <QPushButton>
#include <QApplication>
#include "TriangleWidget.h"

class MyWindow : public QMainWindow {
public:
MyWindow() {
// 创建容器和布局
QWidget* centralWidget = new QWidget(this);
QVBoxLayout* layout = new QVBoxLayout(centralWidget);

// 插入我们的 OpenGL 控件
TriangleWidget* glView = new TriangleWidget(this);
layout->addWidget(glView);

// 插入一个 Qt 原生按钮测试
QPushButton* btn = new QPushButton("Reset Camera", this);
layout->addWidget(btn);

setCentralWidget(centralWidget);
resize(1024, 768);
}
};

int main(int argc, char* argv[]) {
QApplication a(argc, argv);
MyWindow w;
w.show();
return a.exec();
}

TriangleWidget.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QOpenGLShaderProgram>
#include <QOpenGLBuffer>

class TriangleWidget : public QOpenGLWidget, protected QOpenGLFunctions {
public:
using QOpenGLWidget::QOpenGLWidget;

protected:
void initializeGL() override {
initializeOpenGLFunctions(); // 初始化封装后的 GL 函数
glClearColor(0.1f, 0.1f, 0.1f, 1.0f); // 设置背景深灰色

// 1. 定义着色器代码
const char* vsrc = R"(
#version 330 core
layout(location = 0) in vec3 pos;
void main() { gl_Position = vec4(pos, 1.0); }
)";
const char* fsrc = R"(
#version 330 core
out vec4 color;
void main() { color = vec4(1.0, 0.5, 0.2, 1.0); }
)";

// 2. 编译并链接着色器
m_program = new QOpenGLShaderProgram();
m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, vsrc);
m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, fsrc);
m_program->link();

// 3. 准备三角形顶点数据
float vertices[] = {
0.0f, 0.5f, 0.0f, // 顶
-0.5f, -0.5f, 0.0f, // 左下
0.5f, -0.5f, 0.0f // 右下
};

m_vbo.create();
m_vbo.bind();
m_vbo.allocate(vertices, sizeof(vertices));
}

void paintGL() override {
glClear(GL_COLOR_BUFFER_BIT);

m_program->bind();
m_vbo.bind();

// 绑定顶点属性
m_program->enableAttributeArray(0);
m_program->setAttributeBuffer(0, GL_FLOAT, 0, 3);

glDrawArrays(GL_TRIANGLES, 0, 3);

m_vbo.release();
m_program->release();
}

private:
QOpenGLShaderProgram* m_program = nullptr;
QOpenGLBuffer m_vbo;
};

CMakeLists.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
cmake_minimum_required(VERSION 3.24.0)

# 设置项目名称和版本
project(DrawOpenGL VERSION 0.1 LANGUAGES CXX)

#系统变量中没有Qt目录需要添加路径
option(USE_STATIC_QT "是否使用静态Qt" OFF)

if(USE_STATIC_QT)
#set(CMAKE_PREFIX_PATH "C:/D/Program/Qt/6.2.4/MSVC2022_x64_static_624_Release")
#set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
else()
#set(CMAKE_PREFIX_PATH "C:/D/Program/Qt/6.9.0/mingw_64")
endif()

# 查找 Qt 6 包
find_package(Qt6 REQUIRED COMPONENTS Core OpenGLWidgets)

# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 添加可执行文件
set(SOURCE main.cpp TriangleWidget.h)
add_executable(${PROJECT_NAME} ${SOURCE} )
# 输出到项目下的 bin 文件夹
set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/bin")

# 链接 Qt 库
target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Core Qt6::OpenGLWidgets)

CMakePresets.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
{
"version": 3,
"configurePresets": [
{
"name": "base",
"hidden": true,
"generator": "Ninja",
"binaryDir": "${sourceDir}/out/build/${presetName}",
"cacheVariables": {
"CMAKE_EXPORT_COMPILE_COMMANDS": "YES"
}
},
{
"name": "qt-static-release",
"displayName": "Qt 6.2.4 MSVC Static Release",
"inherits": "base",

"architecture": { "value": "x64", "strategy": "external" },
"toolset": { "value": "host=x64", "strategy": "external" },
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release",
"CMAKE_C_COMPILER": "cl.exe",
"CMAKE_CXX_COMPILER": "cl.exe",
"CMAKE_PREFIX_PATH": "C:/D/Program/Qt/6.2.4/MSVC2022_x64_static_624_Release",
"CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreaded"
},
"vendor": {
"jetbrains.com/clion": {
"toolchain": "MSVC"
}
}
},
{
"name": "qt-mingw-dynamic",
"displayName": "Qt 6.9.0 MinGW Dynamic",
"inherits": "base",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_PREFIX_PATH": "C:/D/Program/Qt/6.9.0/mingw_64",
"CMAKE_C_COMPILER": "gcc.exe",
"CMAKE_CXX_COMPILER": "g++.exe"
},
"vendor": {
"jetbrains.com/clion": {
"toolchain": "Qt_Mingw"
}
}
}
],
"buildPresets": [
{ "name": "qt-debug", "configurePreset": "qt-mingw-dynamic" },
{ "name": "qt-release", "configurePreset": "qt-static-release" }
]
}

构建方法

方法一:vs2022打开CMakeLists.txt

方法二:命令行构建