Important: Please read the Qt Code of Conduct -

Problem using glTexSubImage2D with QOpenGLWidget

  • Hello,
    I'm trying to Display a texture within a QOpenGlWidget in a QMainWindow.
    For that I made a class which derived from QopenGlWidget and my corresponding widget is promoted to use that class.

    class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions

    My plan is to first initlialize the texture once in the initializeGL() method, then use the texture id in the paintGL() method and only update it with glTexSubImage2D().


    This works ONLY if I use glTexImage() right before glTexSubImage2D() in the paintGL() method . Otherwise the texture won't be drawn.
    I think there is a problem with the drawing context. But I cannot figure it out.
    Any idea is appreciated.
    Thank you.

    I set the new texture from the outside with a the method void setTexture(...);
    This method also calls update() to repaint the widget.
    Is it possible that calling this method from an outside thread causes the texture to render in another context?

    EDIT 2:
    I tried to set a shared context in the painGl() method. I used the context which was used in the initializeGL() method. Also, I tried do make the context from initializeGL() the current context while drawing in painGL(). Again same result. Here are my OpenGL functions for creating the texture:

    //Works when used in paintGl().
    glTexImage2D(GL_TEXTURE_2D,0, GL_RGB, m_cvImage.cols, m_cvImage.rows,0, GL_BGR, GL_UNSIGNED_BYTE,;
    //Not working when used in paintGl() if glTexImage2D is used to create the texture in initializeGl().
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_cvImage.cols, m_cvImage.rows, GL_BGR,, GL_UNSIGNED_BYTE,;
    //Also working in paintGL()
    glTexImage2D(GL_TEXTURE_2D,0, GL_RGB, m_cvImage.cols, m_cvImage.rows,0, GL_BGR, GL_UNSIGNED_BYTE, NULL);
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_cvImage.cols, m_cvImage.rows, GL_BGR, GL_UNSIGNED_BYTE,;

    When I try to call makeCurrent() in the paintGL() method (even if it should be called automatically right before) I get an Assertion:

    ASSERT: "context" in file opengl\qopenglfunctions.cpp, line 209

    The same applies to the doneCurrent() method (just for testing).
    This tells me that there is no available context for the paintGL() method.
    Yet a check with:

    if (context() == 0)...

    Seems to be fine.