2011-06-15 43 views
1

我有一個QGraphicsScene,其中添加了一個QGraphicsItem。在QGraphicsItem中,我渲染了OpenGL ES 2.0的hello三角形示例中使用的三角形。問題是,如果我創建並編譯除QGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)函數以外的着色器,它們不會被編譯。我知道你應該有一個GL渲染上下文激活,但是當我將視口設置爲GLWidget時不會發生?我嘗試過在QGraphicsItem構造函數或QGraphicsScene中編譯它們,並將QGraphicsItem設置爲父項(我知道它們是非常愚蠢的事情),但是(顯然)沒有任何效果。對我來說最合乎邏輯的是在QGraphicsItem類中創建一個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 = new 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 2011-06-16 23:25:50

+0

我在我的QGraphicsItem中仍然有initShaders(),但是這次我在'view.setViewport(myWidget)之後調用它。 myWidget-> makeCurrent();'而不是之前。哦,愚蠢 – Sassa 2011-06-16 23:35:18