qtpainter画圆

在Qt和OpenGL中,可以通过OpenGL的绘图功能来绘制圆形。以下是一个简单的示例,演示了如何使用Qt和OpenGL绘制一个圆形:

```cpp

include

include

include

include

include

class CircleWidget : public QOpenGLWidget, protected QOpenGLFunctions

{

public:

CircleWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) {}

protected:

void initializeGL() override

{

initializeOpenGLFunctions();

glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

shaderProgram.addShaderFromSourceCode(QOpenGLShader::Vertex, R"(

version 330 core

layout(location = 0) in vec2 pos;

void main()

{

gl_Position = vec4(pos, 0.0, 1.0);

}

)");

shaderProgram.addShaderFromSourceCode(QOpenGLShader::Fragment, R"(

version 330 core

out vec4 FragColor;

void main()

{

FragColor = vec4(0.0, 0.0, 0.0, 1.0);

}

)");

shaderProgram.link();

QVector vertices;

const int numSegments = 100;

const float PI = 3.1415926f;

for (int i = 0; i < numSegments; i)

{

float angle = 2 * PI * i / numSegments;

vertices.append(cos(angle));

vertices.append(sin(angle));

}

vao.create();

vao.bind();

vbo.create();

vbo.bind();

vbo.allocate(vertices.constData(), vertices.size() * sizeof(float));

shaderProgram.enableAttributeArray(0);

shaderProgram.setAttributeBuffer(0, GL_FLOAT, 0, 2);

}

void resizeGL(int w, int h) override

{

glViewport(0, 0, w, h);

}

void paintGL() override

{

glClear(GL_COLOR_BUFFER_BIT);

shaderProgram.bind();

glDrawArrays(GL_LINE_LOOP, 0, 100);

}

private:

QOpenGLShaderProgram shaderProgram;

QOpenGLBuffer vbo;

QOpenGLVertexArrayObject vao;

};

```

在这个例子中,我们创建了一个继承自QOpenGLWidget的自定义小部件CircleWidget,并重写了其initializeGL,resizeGL和paintGL函数用于初始化OpenGL状态、响应窗口大小变化和绘制圆形。

在initializeGL函数中,我们首先初始化OpenGL函数,然后设置清除颜色为白色。接着创建了一个简单的着色器程序,其中顶点着色器负责将顶点位置发送到片段着色器,片段着色器用黑色绘制圆形。然后创建了一个存储顶点数��的顶点缓冲区对象(VBO),并将圆形的顶点数据存入其中。最后创建了一个顶点数组对象(VAO),并将VBO与VAO进行关联。

在resizeGL函数中,我们设置了OpenGL视口大小为窗口大小。

在paintGL函数中,首先清除颜色缓冲区,然后绑定着色器程序,并使用glDrawArrays函数绘制圆形的轮廓。

这只是一个简单的示例,实际的圆形绘制可能需要考虑投影矩阵、模型矩阵等其他因素。但这个例子可以作为一个起点,帮助你开始在Qt和OpenGL中绘制圆形。

免责声明:本网站部分内容由用户自行上传,若侵犯了您的权益,请联系我们处理,谢谢!联系QQ:2760375052 沪ICP备2023024866号-10

分享:

扫一扫在手机阅读、分享本文

评论