2011-06-15 13 views
1

私はQGraphicsItemを追加するQGraphicsSceneを持っています。 QGraphicsItemの中で、OpenGL ES 2.0のhello triangleの例で使われている三角形を描画します。問題は、QGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)関数以外のどこでもシェーダを作成してコンパイルしても、コンパイルされないということです。 GLレンダリングコンテキストをアクティブにしておく必要があることはわかっていますが、ビューポートをGLWidgetに設定してもそれは起こりません。私はQGraphicsItemコンストラクタやQGraphicsSceneでそれらをコンパイルし、QGraphicsItemを親として設定するなど、さまざまなことを試しました(私は非常にばかげたことですが、明らかに何も動作しません)。 QGraphicsItemクラスの中にinitShaders()関数を作成して、シーン内にアイテムが作成された後にinitShaders()関数を作成して呼び出すこともできましたが、これも機能しませんでした。QGraphicsItemのシェーダプログラムを作成する

答えて

2

QGraphicsViewの派生クラスを作成します。 setupViewport(QWidget *ビューポート)をオーバーライドしてシェーダを初期化します。これにより、シェーダのコンパイル時にコンテキストが最新であることを確認できます。ただし、グラフィックビューでsetViewport()を呼び出す前に、項目をシーンに追加する必要があります。

void MyGraphicsView::setupViewport(QWidget *viewport) 
{ 
    QGLWidget *glWidget = qobject_cast<QGLWidget*>(viewport); 
    if (glWidget) { 
     glWidget->makeCurrent(); 
     foreach (QGraphicsItem *item, scene()->items()) 
     { 
      MyGraphicsShaderItem *glItem = qgraphicsitem_cast<MyGraphicsShaderItem*>(item); 
      if (glItem) 
       glItem->initShader(); 
     } 
     glWidget->doneCurrent(); 
    } 
} 
+0

:-)ありがとう、ありがとう、ありがとう!私は実際にそれを実際にはしませんでしたが、あなたは私にアイデアを与えて、私は書いた: 'int main(int argc、char * argv []){ QApplication a(argc、argv); GraphicsScene gScene; GraphicsViewビュー; QGLWidget * myWidget =新しいQGLWidget(QGLFormat(QGL :: SampleBuffers)); view.setViewport(myWidget); myWidget-> makeCurrent(); myGraphicsItem * triangle = new myGraphicsItem(); triangle-> initShaders(); gScene.addItem(triangle); view.setScene(&gScene); view.showMaximized(); return a.exec(); } ' とそれが働いた!ありがとうございました! – Sassa

+0

QGraphicsItemにはまだinitShaders()がありますが、今回は 'view.setViewport(myWidget);の後に呼びます。 myWidget-> makeCurrent(); 'であり、前にはありません。ああ、愚かさ – Sassa

関連する問題