QOpenGLWidget and QPainter ,Can't render 2D and 3D at the same time



  • I don't know why .I do as Qt Assistant:put opengl code in @QPainter::beginNativePainting ();/QPainter::endNativePainting ();@ .But I only get the 3D.
    my code:
    @
    class Render : public QOpenGLWidget
    {
    public:
    Render();
    ~Render();
    protected:
    void initializeGL();
    void paintGL();
    void resizeGL(int w ,int h);
    QOpenGLFunctions_3_3_Core * f;
    QOpenGLBuffer * triangle;
    QOpenGLVertexArrayObject * vao;
    QOpenGLShaderProgram * program;
    QMatrix4x4 mv,p;
    QTimer * time;
    float rota;
    QPainter * painter;
    bool needInit;
    //void paintEvent(QPaintEvent *e);

    };
    @

    @
    #include "render.h"
    GLfloat tri[] =
    {
    0.0f,1.0f,-1.0f,1.0f,
    1.0f,1.0f,-1.0f,1.0f,
    1.0f,0.0f,-1.0f,1.0f,

    };
    Render::Render()
    {
    QSurfaceFormat format;
    format.setDepthBufferSize(24);
    format.setStencilBufferSize(8);
    // format.setVersion(3,3);
    //format.setProfile(QSurfaceFormat::CoreProfile);

    setFormat( format);
    rota = 1.5;
    needInit = true;
    //setAutoFillBackground(false);
    time =  new QTimer;
    connect(time,SIGNAL(timeout()),this,SLOT(update()));
    time->start(50);
    

    }

    Render::~Render()
    {

    }
    void Render::initializeGL()
    {
    f = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_3_3_Core>();
    f->initializeOpenGLFunctions();

    //f = context()->functions();
    

    }
    void Render::resizeGL(int w ,int h)
    {

    p.setToIdentity();
    p.perspective(35.0f,float(w)/float(h),1.0f,30.0f);
    

    }

    void Render::paintGL()
    {
    QPainter pntr(this);
    // painter->setViewport(50,50,100,100);
    pntr.beginNativePainting();
    QOpenGLShaderProgram programs ;
    programs.addShaderFromSourceCode(QOpenGLShader::Vertex,
    "#version 330 core \n
    layout(location = 0) in vec4 vertex;
    uniform mat4 mvp;
    void main()
    {
    gl_Position = mvp * vertex;
    }");

    programs.addShaderFromSourceCode(QOpenGLShader::Fragment,
                                     "#version 330 core \n\
                                     out vec4 fragColor;\
            void main() \
    { \
        fragColor = vec4(0.0f,1.0f,0.0f,1.0f);\
    }");
    programs.link();
    
    QOpenGLVertexArrayObject vaos;
    vaos.create();
    f->glBindVertexArray(vaos.objectId());
    QOpenGLBuffer triangles(QOpenGLBuffer::VertexBuffer);
    triangles.create();
    f->glBindBuffer(GL_ARRAY_BUFFER,triangles.bufferId());
    triangles.setUsagePattern(QOpenGLBuffer::DynamicDraw);
    triangles.allocate(tri,sizeof(tri));
    programs.enableAttributeArray(0);
    programs.setAttributeBuffer(0,GL_FLOAT,0,4,0);
    
    f->glEnable(GL_DEPTH_TEST);
    
    needInit = false;
    
    // this->makeCurrent();
    f->glViewport(0,0,width(),height());
    f->glClearColor(1.0f,0.5f,0.5f,1.0f);
    f->glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
    
    programs.bind();
    mv.setToIdentity();
    
    mv.lookAt(QVector3D(0.0f,0.0f,5.0f),QVector3D(0.0f,0.0f,0.0f),QVector3D(0.0f,1.0f,0.0f));
    mv.rotate(0.5+rota,0,1,0);
    programs.setUniformValue("mvp",p*mv);
    f->glBindVertexArray(vaos.objectId());
    f->glDrawArrays(GL_TRIANGLES,0,3);
    rota=rota+1.5;
    
    pntr.endNativePainting();
    
    pntr.drawText(50,100,"Look This!");
    

    }
    @


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.