如何处理QGLWidget的glXXX函数调用?

时间:2011-08-16 22:03:00

标签: c++ qt opengl qglwidget

Qt如何处理对QGLWidget中各种OpenGL函数(如glVertex3f)的函数调用?

这些调用是否是QGLWidget对象的一部分,还是严格意义上的全局命名空间OpenGL函数?

从单独的类中绘制QGLWidget的最佳做法是什么?

2 个答案:

答案 0 :(得分:3)

那些gl…函数只是常规的OpenGL函数,或者如果使用扩展包装器,宏名称将解析为包装器的符号。 QGLWidget负责OpenGL上下文创建和管理,就像GLUT或GLFW一样。

QGLWidget提供成员函数QGLWidget::makeCurrent,它选择QGLWidget实例的OpenGL上下文作为调用QGLWidget::makeCurrent的线程中的当前上下文。 QGLWidget::swapBuffers发出双缓冲交换。在使用完OpenGL上下文后,比如在渲染器函数的末尾,调用QGLWidget::doneCurrent,它将从当前线程中分离上下文;这是使OpenGL在多线程程序中工作的必要条件 - 如果确保所有OpenGL操作都是在同一个线程中完成的,则可以省略对QGLWidget::doneCurrent的调用。

当然,在一个真正的OOP时尚程序中,你应该将对另一个类的引用传递给你的QGLWidget派生,并从QGLWidget的绘图处理程序中调用那个绘图函数。

答案 1 :(得分:1)

它们是全局命名空间OpenGL函数。

在paintGL()函数中调用另一个类的绘图函数。

void MyGLWidget::paintGL()
{
    other->draw();
}