了解QPainter在QOpenGLWidget的paintEvent函数中的重要性

1u4esq0p  于 2023-05-22  发布在  其他
关注(0)|答案(1)|浏览(144)

overpaint example of qt中,如果我删除QPaint调用,则不会绘制任何内容。

void GLWidget::paintEvent(QPaintEvent *event)
{
    makeCurrent();
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();

    qglClearColor(qtPurple.dark());
    glShadeModel(GL_SMOOTH);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_MULTISAMPLE);
    static GLfloat lightPosition[4] = { 0.5, 5.0, 7.0, 1.0 };
    glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);

    setupViewport(width(), height());

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0.0, 0.0, -10.0);
    glRotatef(xRot / 16.0, 1.0, 0.0, 0.0);
    glRotatef(yRot / 16.0, 0.0, 1.0, 0.0);
    glRotatef(zRot / 16.0, 0.0, 0.0, 1.0);

    logo->draw();

    glShadeModel(GL_FLAT);
    glDisable(GL_CULL_FACE);
    glDisable(GL_DEPTH_TEST);
    glDisable(GL_LIGHTING);

    glMatrixMode(GL_MODELVIEW);
    glPopMatrix();

    //QPainter painter(this); ---> I remove this and nothing
    //painter.end();               will be displayed. 
}

但我很好奇,因为里面的logo->draw();有一些QpenGL调用,比如“glDrawElements”,我认为它不应该依赖于QPainter。
我想了解QPainter如何影响此功能。以及为什么当我们覆盖paintGL时不使用它,可以在此example中看到

oogrdqng

oogrdqng1#

paintEvent()内部绘制时,您需要自己调用swapBuffers()或使用QPainter,这将在其析构函数或QPainter::end()中调用swapBuffers()

相关问题