[Interest] Sharing an OGL context with multiple QGLWidget using designer (or anything else)

Paulo Silva paulo.jnkml at gmail.com
Tue Jun 19 19:53:36 CEST 2012


On Wed, Jun 20, 2012 at 2:50 AM, Paulo Silva <paulo.jnkml at gmail.com> wrote:
> Just an add-on, I also tried to use the constructor
>
> QGLWidget::QGLWidget ( QWidget * parent = 0, const QGLWidget *
> shareWidget = 0, Qt::WindowFlags f = 0 )
>
> and although I pass the first QGLWidget created to the preceding

I ment "subsequent" or following.

> widgets, the effect seems to be the same as passing "shareWidget = 0".
>
> http://doc.qt.nokia.com/4.7-snapshot/qglwidget.html#QGLWidget
> recommends looking at
> http://doc.qt.nokia.com/4.7-snapshot/opengl-textures.html
> But that is not very helpful since the glwidgets are created with
> "shareWidget = 0" here:
> http://doc.qt.nokia.com/4.7-snapshot/opengl-textures-window-cpp.html
>
>  glWidgets[i][j] = new GLWidget(0, 0);
>
> and for each context we have the code:
> void GLWidget::initializeGL()
>  {
>     makeObject();
> (...)
> }
>
> which just loads every texture again for each widget:
> void GLWidget::makeObject()
>  {
>     (...)
>
>     for (int j=0; j < 6; ++j) {
>         textures[j] = bindTexture
>             (QPixmap(QString(":/images/side%1.png").arg(j + 1)),
> GL_TEXTURE_2D);
>     }
>     (...)
> }
>
> Please correct me if I'm wrong.
>
> Thanks,
> Paulo
>
> On Tue, Jun 19, 2012 at 10:48 PM, Paulo Silva <paulo.jnkml at gmail.com> wrote:
>> Hi everyone,
>>
>> can I share an OGL context between two or more QGLWidgets, when the
>> interface is made using designer?.
>> Since I'm not creating the widgets myself, how can I take the context
>> of one of the widgets and share it with the other widgets?
>>
>> I tried to use static class members like:
>>
>> QGLContext* const MyClass::_shared_context(new QGLContext(QGLFormat()));
>> QGLWidget* MyClass::_shared_widget(0); // initialized to the first
>> widget created
>>
>> and tried to pass it to the constructor,
>>
>> MyClass(QWidget *parent):
>>   QGLWidget(_shared_context, parent, _shared_widget),
>> {
>>    static bool once(false);
>>    if(not once) {
>>        once = true;
>>        _shared_widget = this;
>>    } else {
>>        assert(_shared_context == context());
>>        // assert(isSharing()); this always fails
>>    }
>> }
>>
>> But it does not seem to work as isSharing() returns false for all widgets.
>> Appart from that updateGL fails for all widgets but the first. The
>> others are just painted with the background color.
>> However they do share the same context, as the first assert holds.
>>
>> Is there a correct way of doing this? Any designer functionality?
>>
>> Thanks
>> Paulo



More information about the Interest mailing list