如何使用QOpenGLWidget在Qt的单独线程中渲染opengl?

时间:2018-10-06 21:34:36

标签: multithreading qt opengl

我在Google上搜索后发现,可以使用qml在单独的线程上进行绘制。 http://doc.qt.io/qt-5/qtquick-scenegraph-openglunderqml-example.html

但这不是我所需要的。如何在没有qml的情况下使用常见的qt小部件在单独的线程中渲染?

1 个答案:

答案 0 :(得分:0)

如果您的QWidget继承自QOpenglWidget,您可以致电

 this->makeCurrent();

但是我个人更喜欢使用more efficient健壮的方法来封装OpenGL上下文,方法是使用QWindow并在那里配置所有OpenGL相关设置:

这里是一个例子:

bool MyOpenGLWindow::Create()
{
  this->requestActivate();
  if(!glContext)
  {

    glContext= new QOpenGLContext(this);
    QSurfaceFormat fmt = requestedFormat();
    int maj = fmt.majorVersion();
    int min = fmt.minorVersion();
    glContext->setFormat( requestedFormat());
    glContext->create();
    if(glContext->isValid() == false)
    {
        QString str;
        str.sprintf("Failed to create GL:%i.%i context",maj,min);
        return false;
    }
  }

  glContext->makeCurrent(this);
  //after this line you can work with OpenGL
  initializeOpenGLFunctions();
  glDisable(GL_DEPTH_TEST);  
  glEnable(GL_CULL_FACE);
  //etc...

现在,请记住,每次在线程中生成(或移动现有的)此类的实例时,都必须将上下文设置为当前。