答えは少し遅れますが、ウィジェットを作成したスレッドによってウィジェットを新しいスレッドに移動する必要があります。あなたのケースでのようなもの:
QGLWidget *glWidget=new QGLWidget();
QThread *newThread=new QThread();
glWidget->doneCurrent();
glWidget->context()->moveToThread(newThread);
は、ここで私は、新しいスレッドにOpenGLコンテキストを移動し、これはQGLWidgetでいくつかのオーバーライドがキャッチされ、無視されている必要があります。 QGLWidgetから新しい派生クラスを作成し、それをオーバーライドする必要があります。
virtual void glInit();
virtual void glDraw();
virtual void initializeGL();
virtual void resizeGL(int width, int height);
virtual void paintGL();
これにより、標準UIスレッドは、UIスレッドでOpenGLコンテキストを最新にすることを試みません。上記をオーバーライドすると、いくつかのイベントが発生したことをスレッドに通知するイベントシステムが必要になります。主にresizeGlとpaintGLが必要です。そうでない場合、ウィジェットは周囲の他のユーザーと適切に反応しません。
最後の部分はQGLWidgetの作成です。構築物中のパラメータの一つは、constのQGLWidget * shareWidgetです:
QGLWidget (QWidget * parent = 0, const QGLWidget * shareWidget = 0, Qt::WindowFlags f = 0)
QGLWidget (QGLContext * context, QWidget * parent = 0, const QGLWidget * shareWidget = 0, Qt::WindowFlags f = 0)
QGLWidget (const QGLFormat & format, QWidget * parent = 0, const QGLWidget * shareWidget = 0, Qt::WindowFlags f = 0)
あなたは、スレッドのGLWidgetを作成するときに確認してUI QGLWidgetとねじGLWidget(上記のオーバーライドの全てでQGLWidgetからderivided)を作成しますQGLWidgetをsharedWidgetとして提供します。これにより、2つのOpenGLが共有されたコンテキストになり、両方が見ることのできるテクスチャを読み込むことができます。私は最近、主にOpenGLの/ OpenCLの相互運用のためのネジQGLWidgetsを使用して、ほとんどの例プログラムを書いた
QGLWidget *glWidget=new QGLWidget();
GLWidget *threadedWidget=new GLWidget(0/*parent*/, glWidget);
QThread *newThread=new QThread();
threadedWidget->moveToThread(newThread);
コードについては、それが単一のコンテキストを共有する描画スレッドでmuliple QGLWidgetsを使用して示しています。コードは次のようになります。コードはgithubにあり、説明はこちらhttp://www.krazer.com/?p=109
イエップ。詳細はこちら[こちら](http://blog.qt.digia.com/blog/2011/06/03/threaded-opengl-in-4-8/)。また、Qt 5では、QGL *クラスではなくQOpenGL *クラスを実際に使用する必要があります。 – peppe