Qt 为QGraphicsItem创建着色器程序

Qt 为QGraphicsItem创建着色器程序,qt,opengl-es-2.0,qgraphicsitem,Qt,Opengl Es 2.0,Qgraphicsitem,我有一个QGraphicscene,在其中我添加了一个QGraphicsItem。在QGraphicsItem中,我渲染了OpenGL ES 2.0的hello triangle示例中使用的三角形。问题是,如果我在QGraphicsItem::paint(QPainter*painter,const QStyleOptionGraphicsItem*选项,QWidget*小部件)函数之外的任何地方创建和编译着色器,它们都不会被编译。我知道应该有一个GL渲染上下文处于活动状态,但当我将视口设置为G

我有一个QGraphicscene,在其中我添加了一个QGraphicsItem。在QGraphicsItem中,我渲染了OpenGL ES 2.0的hello triangle示例中使用的三角形。问题是,如果我在
QGraphicsItem::paint(QPainter*painter,const QStyleOptionGraphicsItem*选项,QWidget*小部件)
函数之外的任何地方创建和编译着色器,它们都不会被编译。我知道应该有一个GL渲染上下文处于活动状态,但当我将视口设置为GLWidget时,这种情况不会发生吗??我尝试了各种方法,比如在QGraphicsSitem构造函数或QGraphicscene中编译它们,并将QGraphicsSitem设置为父级(我知道这是非常愚蠢的事情),但(显然)没有任何效果。在我看来,最符合逻辑的是在QGraphicsSitem类中创建initShaders()函数,并在我的场景中创建项目后调用它,但这也不起作用。

创建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();
    }
}
void MyGraphicsView::setupViewport(QWidget*视口)
{
QGLWidget*glWidget=qobject_cast(视口);
if(glWidget){
glWidget->makeCurrent();
foreach(QGraphicsItem*项,场景()->项())
{
MyGraphicsShaderItem*glItem=QGraphicsSitem_铸件(项目);
if(glItem)
glItem->initShader();
}
glWidget->doneCurrent();
}
}
:-)谢谢,谢谢,谢谢!!实际上我并没有这样做,但你给了我一个想法,我写道:
intmain(intargc,char*argv[]){QApplication a(argc,argv);graphicscene gScene;GraphicsView视图;QGLWidget*myWidget=newqglwidget(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();}
成功了!!再次感谢!我的QGraphicsItem中还有一个initShaders(),但这次我在
view.setViewport(myWidget);myWidget->makeCurrent();
之后调用它。噢,太愚蠢了